10

openfeign 调用的时候如何去除统一响应封装

 2 years ago
source link: https://www.v2ex.com/t/817416
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  Java

openfeign 调用的时候如何去除统一响应封装

  Geekerstar · 3 小时 9 分钟前 · 379 次点击

目前用 @RestControllerAdvice 封装了统一响应,包上了 success 、code 等统一响应。

A 服务通过 feign 调用 B 服务后获取的结果中,也包上了这个响应,如何统一的去除通过 feign 调用而包装的统一响应呢?让获取到的结果可以直接使用

第 1 条附言  ·  1 小时 28 分钟前

之前的做法是用 @RestControllerAdvice 来统一封装响应参数,并且提供不封装统一响应的注解,好处是每个接口不需要写 Response<String> 而是直接返回 String 就行了,起初发现这种方案对 Knife4j 有影响,但是可以通过一些配置来解决。然后就是 feign 调用的时候,不好判断是否需要加上统一响应。


结果:放弃了全局统一响应,Feign 调用也直接返回 Response 。
6 条回复    2021-11-23 18:40:24 +08:00

devswork

devswork   2 小时 55 分钟前

写个解析 tool 类不就行了,顺便还能 check 一下 code

xwayway

xwayway   2 小时 44 分钟前

当初让你卷八股文你不肯,现在游泳了吧。来来来,设计模式来一波,今天你用 openfeigin ,明天用纯 httpclient ,后天用 resttemplate 。这个时候应该加上一个中介者,来减少具体调用执行层和调用方之间的耦合,同时可以将 success ,code 这些统一格式的解析放到这个中介者里面来,中介者返回给调用方的就是纯纯的业务对象

securityCoding

securityCoding   2 小时 35 分钟前

openfeign 支持泛型反序列化的,为什么要去掉呢?

BBCCBB

BBCCBB   2 小时 9 分钟前

feign 有 Decoder, 你可以实现自己的 Decoder 来处理. 不过你这个做法不太好..

直接 1 楼的方式, 写个 Util 方法来 unwrap 咯.

amoyiki

amoyiki   1 小时 15 分钟前

写个工具类即可
```java
public static <T> List<T> getFeignDataList(Callable<RspResult> feignFunc, Class<T> clazz) throws Exception {
RspResult ret = feignFunc.call();
if (ret.getCode() == 200) {
// 判断是否是有 items 数组,有的话取出 items 后在进行反序列化
List<T> ts = null;
String s = JsonUtils.objectToJson(ret.getData());
if (!StringUtils.isEmpty(s) && s.contains("items")) {
Map map = JsonUtils.objectToPojo(ret.getData(), Map.class);
ts = JsonUtils.objectToList(map.get("items"), clazz);

} else {
ts = JsonUtils.objectToList(ret.getData(), clazz);
}

return ts;
}
return null;
}
```

xuanbg

xuanbg   6 分钟前

在网关上通过拦截器封装,所以内部调用获取到的 body 就是纯粹的数据。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK