# 自定义返回结果

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

针对`alipay.story.find`接口，微服务端返回结果如下：

```json
{
    "name": "白雪公主",
    "id": 1,
    "gmtCreate": 1554193987378
}
```

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

```json
{
	"alipay_story_find_response": {
		"msg": "Success",
		"code": "10000",
		"name": "白雪公主",
		"id": 1,
		"gmtCreate": 1554193987378
	},
	"sign": "xxxxx"
}
```

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

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

代码实现如下：

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

详见`DefaultDataNameBuilder.java`

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

```java
@Configuration
public class ZuulConfig extends AlipayZuulConfiguration {

    static {
        ...
        ApiConfig.getInstance().setDataNameBuilder(new CustomDataNameBuilder());
        ...
    }

}
```

设置后，网关统一的返回结果如下：

```json
{
	"result": {
		...
	},
	"sign": "xxxxx"
}
```

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

```json
{
	"data": {
		...
	},
	"sign": "xxxxx"
}
```

**注**：网关设置了CustomDataNameBuilder后，SDK也要做相应的更改：`SdkConfig.dataNameBuilder = new CustomDataNameBuilder();`

## 自定义结果处理

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

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

方法merge参数说明如下：

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

方法返回最终结果

2. 配置自定义类

```java
public class SopGatewayApplication {
    
    public static void main(String[] args) {
        ApiConfig.getInstance().setZuulResultExecutor(new MyzuulResultExecutor());
        SpringApplication.run(SopGatewayApplication.class, args);
    }

}
```


## 不合并结果

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

```java
public class SopGatewayApplication {
    
    public static void main(String[] args) {
        ApiConfig.getInstance().setMergeResult(false);
        SpringApplication.run(SopGatewayApplication.class, args);
    }

}
```

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