自定义返回结果

网关默认对业务结果进行合并,然后返回统一的格式。

针对alipay.story.find接口,微服务端返回结果如下:

  1. {
  2. "name": "白雪公主",
  3. "id": 1,
  4. "gmtCreate": 1554193987378
  5. }

网关合并后,最终结果如下

  1. {
  2. "alipay_story_find_response": {
  3. "msg": "Success",
  4. "code": "10000",
  5. "name": "白雪公主",
  6. "id": 1,
  7. "gmtCreate": 1554193987378
  8. },
  9. "sign": "xxxxx"
  10. }

其中alipay_story_find_response是它的数据节点。规则是:

将接口名中的点.转换成下划线_,后面加上_response

代码实现如下:

  1. String method = "alipay.story.find";
  2. return method.replace('.', '_') + "_response";

详见DefaultDataNameBuilder.java

如果要更改数据节点,比如result,可使用CustomDataNameBuilder.java

  1. @Configuration
  2. public class ZuulConfig extends AlipayZuulConfiguration {
  3. static {
  4. ...
  5. ApiConfig.getInstance().setDataNameBuilder(new CustomDataNameBuilder());
  6. ...
  7. }
  8. }

设置后,网关统一的返回结果如下:

  1. {
  2. "result": {
  3. ...
  4. },
  5. "sign": "xxxxx"
  6. }

此外,构造方法可指定自定义字段名称:new CustomDataNameBuilder("data");。设置后,数据节点将变成data

  1. {
  2. "data": {
  3. ...
  4. },
  5. "sign": "xxxxx"
  6. }

:网关设置了CustomDataNameBuilder后,SDK也要做相应的更改:SdkConfig.dataNameBuilder = new CustomDataNameBuilder();

自定义结果处理

如果想要对微服务结果做更深一步处理,步骤如下:

  1. 新增一个类,继承ZuulResultExecutor.java,并重写public String merge(T exchange, JSONObject responseData)方法

方法merge参数说明如下:

  1. exchangeRequestContext对象
  2. responseData:微服务端返回的结果

方法返回最终结果

  1. 配置自定义类
  1. public class SopGatewayApplication {
  2. public static void main(String[] args) {
  3. ApiConfig.getInstance().setZuulResultExecutor(new MyzuulResultExecutor());
  4. SpringApplication.run(SopGatewayApplication.class, args);
  5. }
  6. }

不合并结果

如果不希望对结果进行合并,可设置ApiConfig.getInstance().setMergeResult(false);

  1. public class SopGatewayApplication {
  2. public static void main(String[] args) {
  3. ApiConfig.getInstance().setMergeResult(false);
  4. SpringApplication.run(SopGatewayApplication.class, args);
  5. }
  6. }

这样,网关最终返回结果即为微服务端的返回结果。