假设我给出了以下端点:
GET /hello/{id}?idType={idType}
其中 idType 的允许值为 ["loginId", "contactId"]
我必须使用此服务:
@HttpExchange("/hello")
public interface HelloClient {
@GetExchange("/{id}")
String hello(@PathVariable String id, @RequestParam IdType idType);
}
其中 IdType 是一个枚举:
public enum IdType {
LOGIN_ID("loginId"),
CONTACT_ID("contactId");
String idType;
IdType(String idType) { this.idType = idType; }
}
通常可以定义一个 Converter
GET /hello/xyz?idType=loginId
我怎样才能用 HttpInterfaces 做同样的事情?
helloClient.hello("xyz", IdType.LOGIN_ID);
expected: GET /hello/xyz?idType=loginId
actual: GET /hello/xyz?idType=LOGIN_ID
我不想拥有此代码:
helloClient.hello("xyz", IdType.LOGIN_ID.getIdType());
这样的事情可能吗?转换器好像没用过。
定义了 HTTP 接口后,我们必须创建 RestClient、WebClient 或 RestTemplate 类型的代理。是的,我们可以仅在我们创建的代理对象上注册 HttpMessageConverters ,也可以通过将其注册为 bean 来全局注册 HttpMessageConverters 。这将使我们可以添加或修改我所看到的
正文和标题中的内容。
在我们的例子中,我们现在想要修改查询参数,我认为转换器无法完成此操作。所以我能想到的一种方法是添加一个拦截器,就像我在创建 RestClient 代理时添加的那样。
@Bean
public UtilityClient createClient () {
RestClient restClient = RestClient.builder()
.baseUrl("http://localhost:8080/")
.requestInterceptors(interceptorsConsumer -> {
interceptorsConsumer.add(
(request, body, execution) -> {
String query = request.getURI().getQuery();
// our modification code here.
return execution.execute(request, body);
}
);
})
.build();
RestClientAdapter adapter = RestClientAdapter.create(restClient);
HttpServiceProxyFactory factory = HttpServiceProxyFactory.builderFor(adapter).build();
UtilityClient service = factory.createClient(UtilityClient.class);
return service;
}
我们可以在拦截器中添加修改查询参数的逻辑。但我确实觉得修改字符串可能会“不稳定且不可预测”。我很想看看是否有人有其他方法可以做到这一点。