You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
SOP/doc/docs/files/10087_自定义返回结果.md

2.5 KiB

自定义返回结果

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

针对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();

自定义结果处理

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

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

方法merge参数说明如下:

exchange:RequestContext对象
responseData:微服务端返回的结果

方法返回最终结果

  1. 配置自定义类
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);
    }

}

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