自定义返回结果
网关默认对业务结果进行合并,然后返回统一的格式。
针对alipay.story.find
接口,微服务端返回结果如下:
{
"name": "白雪公主",
"id": 1,
"gmtCreate": 1554193987378
}
网关合并后,最终结果如下
{
"alipay_story_find_response": {
"msg": "Success",
"code": "10000",
"name": "白雪公主",
"id": 1,
"gmtCreate": 1554193987378
},
"sign": "xxxxx"
}
其中alipay_story_find_response
是它的数据节点。规则是:
将接口名中的点
.
转换成下划线_
,后面加上_response
代码实现如下:
String method = "alipay.story.find";
return method.replace('.', '_') + "_response";
详见DefaultDataNameBuilder.java
如果要更改数据节点,比如result
,可使用CustomDataNameBuilder.java
。
@Configuration
public class ZuulConfig extends AlipayZuulConfiguration {
static {
...
ApiConfig.getInstance().setDataNameBuilder(new CustomDataNameBuilder());
...
}
}
设置后,网关统一的返回结果如下:
{
"result": {
...
},
"sign": "xxxxx"
}
此外,构造方法可指定自定义字段名称:new CustomDataNameBuilder("data");
。设置后,数据节点将变成data
{
"data": {
...
},
"sign": "xxxxx"
}
注:网关设置了CustomDataNameBuilder后,SDK也要做相应的更改:SdkConfig.dataNameBuilder = new CustomDataNameBuilder();
自定义结果处理
如果想要对微服务结果做更深一步处理,步骤如下:
- 新增一个类,继承
ZuulResultExecutor.java
,并重写public String merge(T exchange, JSONObject responseData)
方法
方法merge参数说明如下:
exchange:RequestContext对象
responseData:微服务端返回的结果
方法返回最终结果
- 配置自定义类
public class SopGatewayApplication {
public static void main(String[] args) {
ApiConfig.getInstance().setZuulResultExecutor(new MyzuulResultExecutor());
SpringApplication.run(SopGatewayApplication.class, args);
}
}
不合并结果
如果不希望对结果进行合并,可设置ApiConfig.getInstance().setMergeResult(false);
public class SopGatewayApplication {
public static void main(String[] args) {
ApiConfig.getInstance().setMergeResult(false);
SpringApplication.run(SopGatewayApplication.class, args);
}
}
这样,网关最终返回结果即为微服务端的返回结果。