【问题标题】:How to make Feign POST request without a request body and with query params?如何在没有请求正文和查询参数的情况下发出 Feign POST 请求?
【发布时间】:2017-06-27 06:36:24
【问题描述】:

我正在使用带有Apache Http Client 的 Feign,我想支持以下 jax-rs 接口:

@POST
@Path("/do_something")
void doSomething(@QueryParam("arg") String arg);

但是,ApacheHttpClient 使用 RequestBuilder,它将没有正文/实体的请求的查询参数转换为 UrlEncodedFormEntity。

我正在将我的 API 转换为 jax-rs,并且我不想破坏向后兼容性。有没有办法在不调整我的 API 的情况下使用 Feign? OkHttp 或 Ribbon 客户端是否支持带有查询参数且没有正文/实体的 POST?是否有另一个支持此功能的 java jax-rs 客户端?

另外,RequestBuilder 将查询参数转换为 UrlEncodedFormEntity 是否有原因? apache-httpclient 库中是否有替代的 HttpUriRequest 构建器不执行此操作? RequestBuilder 的 build 方法有以下几行代码:

if (entity == null && (HttpPost.METHOD_NAME.equalsIgnoreCase(method) || HttpPut.METHOD_NAME.equalsIgnoreCase(method))) {
  entity = new UrlEncodedFormEntity(parameters, HTTP.DEF_CONTENT_CHARSET);
} else {
  // omitted expected behavior
}

在切换到 Feign 之前,我的代码构造了一个类似于以下内容的 HttpUriRequest:

URI uri = new URIBuilder()
        .setScheme("https")
        .setHost("localhost")
        .setPath("service/do_something")
        .addParameter("arg", "value")
        .build();
HttpUriRequest request = new HttpPost(uri);

【问题讨论】:

    标签: http-post apache-httpclient-4.x feign


    【解决方案1】:

    如果您愿意稍微破坏 API 并保持对 @QueryParam 的支持,那么您可以在 feign 客户端上定义一个请求拦截器,将纯文本实体/正文添加到请求中:

    .requestInterceptor(template -> {
      if (template.method().equals(HttpPost.METHOD_NAME) && template.queries().keySet().size() > 0 && template.body() == null) {
        template.body(" ");
      }
    })
    

    然后,您的 API 将发生以下变化:

    @POST
    @Consumes(MediaType.TEXT_PLAIN)
    @Path("/do_something")
    void doSomething(@QueryParam("arg") String arg);
    

    但是,这会破坏 API,因为服务器现在需要/使用带有纯文本实体/正文的 POST 消息。

    我认为没有 requestInterceptor 和 Feign 的 @Body 模板也可以做到这一点:

    @POST
    @Consumes(MediaType.TEXT_PLAIN)
    @Body(" ")
    @Path("/do_something")
    void doSomething(@QueryParam("arg") String arg);
    

    但是,这意味着您的 API 必须包含 Feign 而不是纯 jax-rs 注释。

    【讨论】:

      猜你喜欢
      • 2016-06-15
      • 1970-01-01
      • 2017-01-11
      • 2018-10-15
      • 2017-09-15
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多