我的服务是一部分业务场景的统一的出口,为了方便,我定义了我调用业务方的入参和出参,于是写了一个通用的Feign的方法:
@Headers({"Content-Type: application/json", "Accept: application/json"})
@RequestLine("GET /")
Response<PromptResult> getPromatData(@Param("cid") Long cid);
针对不同的业务场景,我定义了个枚举
@Getter
@AllArgsConstructor
public enum SceneEnum {
SCENE_DEMO("demo", "demo", ""http://demo-server/get/data"")
;
/**
* 场景编码
*/
private String sceneCode;
/**
* 场景名称
*/
private String sceneName;
/**
* 场景请求URL
*/
private String sceneRequestUrl;
private static final Map<String, SceneEnum> MAP = new HashMap<>();
static {
for (SceneEnum handlerTypeEnum : values()) {
MAP.put(handlerTypeEnum.getSceneCode(), handlerTypeEnum);
}
}
public static SceneEnum ofSceneCode(String sceneCode) {
return MAP.get(sceneCode);
}
}
不同的业务场景调用的时候
IPromatDataService target = Feign.builder().client(feignClient)
.encoder(new JacksonEncoder())
.decoder(new JacksonDecoder())
.target(IPromatDataService.class, SceneEnum.SCENE_DEMO.getRequestUrl());
Response<PromptResult> promatData = target.getPromatData(cid);
满心以为自己写的没有,单元测试的时候发现是请求返回的是不支持的请求方式,以自己使用Feign的经验,应该是自己想用GET结果实际发起请求转为了POST,通过查询测试,做出了如下修改
@Headers({"Content-Type: application/json", "Accept: application/json"})
@RequestLine("GET /")
Response<PromptResult> getPromatData();
SCENE_DEMO("demo", "demo", "http://demo-server/get/data?cid={0}")
IPromatDataService target = Feign.builder().client(feignClient)
.encoder(new JacksonEncoder())
.decoder(new JacksonDecoder())
.target(IPromatDataService.class, MessageFormat.format(SceneEnum.SCENE_DEMO.getRequestUrl(),cid);
Response<PromptResult> promatData = target.getPromatData();
本文介绍了在使用Feign进行API调用时,原本定义为GET请求的方法在实际执行时变成了POST请求的问题。作者通过分析和测试,发现了问题在于URL参数的处理方式,并给出了修正后的代码,将请求URL改为包含占位符的形式,成功解决了问题。
2098

被折叠的 条评论
为什么被折叠?



