我必须调用一个实现OData协议的服务器。我使用的是Spring和Feign客户端。我一如既往地定义了接口,这是我在里面写的调用服务器的方法:
@RequestMapping(method = RequestMethod.GET, value = "/resource")
ResponseBase<List<Resource>> getResourcer(@RequestParam Map<String, String> odata);
我必须根据上下文插入$filter
、$skip
和$top
,所以在运行时我创建了一个Map,它可以包含这些关键字中的一个或多个。在我测试的场景中,我有这样的东西:
Map<String, String> odata = new HashMap<>();
odata.put("$filter=", "created_at".concat(" ge ").concat(fromTime));
ResponseBase<List<Resource>> response = repository.getResource(odata);
但这是被调用的url:
/resource?%24filter%253D=created_at%20ge%201920202921
有没有办法避免在查询参数中进行编码?或者用Spring调用实现OData的rest api的一种更简单的方法?
编辑1:
我使用
@Bean
public RequestInterceptor myCustomInterceptor() {
return new FeignDecoderUriInterceptor();
}
其中FeignDecoderUriInterceptor
具有以下逻辑:
public class FeignDecoderUriInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
System.out.print(template.request().url());
template.uri(
template.request()
.url()
.replace("%20", " ")
.replace("%24", "$")
);
}
}
但即使调用正确,这也不能正常工作。
这应该有效:
odata.put("$filter", "created_at".concat(" ge ").concat(fromTime));