我的服务是一部分业务场景的统一的出口,为了方便,我定义了我调用业务方的入参和出参,于是写了一个通用的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();