繁体   English   中英

Apache HttpComponents 5:使用 HttpAsyncClient POST 表单数据

[英]Apache HttpComponents 5: POST form data with HttpAsyncClient

我正在寻找使用HttpAsyncClient POST 表单数据的解决方案。 到目前为止,我发现的所有示例都只发送了简单的 GET 请求。 这是我到目前为止所得到的:

try (CloseableHttpAsyncClient client = HttpAsyncClients.createDefault()) {
  SimpleHttpRequest httpPost = SimpleHttpRequests.post("http://httpbin.org");
  // How to add key=value as form data to httpPost?
  Future<SimpleHttpResponse> future = client.execute(httpPost, new FutureCallback<SimpleHttpResponse>() {
    @Override
    public void completed(SimpleHttpResponse simpleHttpResponse) {
      System.out.println(simpleHttpResponse.getCode());
      System.out.println(simpleHttpResponse.getBody());
    }

    @Override
    public void failed(Exception e) {
      System.out.println(e);
    }

    @Override
    public void cancelled() {
      System.out.println("cancelled");
    }
  }
}

我还查看了源代码,在那里我找到了SimpleHttpRequest::setBody方法和相应的SimpleBody类。 但它们似乎也不支持表单数据。

基本上,我需要相当于OkHttpFormBody

在对 Apache HttpComponents 5 的文档和源代码进行了一些挖掘之后,我想出了以下解决方案。 我需要创建一个AsyncRequestProducer和一个AsyncResponseConsumer而不是使用SimpleHttpRequests 请求生产者对象定义了如何创建我的请求,与SimpleHttpRequest ,它还能够生成我需要的表单主体。 示例代码:

try (CloseableHttpAsyncClient client = HttpAsyncClients.createDefault()) {
  client.start();
  AsyncRequestProducer producer = AsyncRequestBuilder.post()
          .setUri("http://httpbin.org")
          .addParameter("key", "value") // <- form parameters in body
          .build();
  AsyncResponseConsumer<SimpleHttpResponse> consumer = SimpleResponseConsumer.create();
  client.execute(producer, consumer, new FutureCallback<SimpleHttpResponse>() {
    @Override
    public void completed(SimpleHttpResponse simpleHttpResponse) {
      System.out.println(simpleHttpResponse.getCode());
      System.out.println(simpleHttpResponse.getBody());
    }

    @Override
    public void failed(Exception e) {
      System.out.println(e);
    }

    @Override
    public void cancelled() {
      System.out.println("cancelled");
    }
  });
}

或者,我可以使用AsyncEntityProducer来生成表单主体:

Iterable<NameValuePair> params = Stream.of(new BasicNameValuePair("key", "value"))
        .collect(Collectors.toList());
AsyncEntityProducer entityProducer = AsyncEntityProducers.createUrlEncoded(params, Charsets.UTF_8);
AsyncRequestProducer producer = AsyncRequestBuilder.post()
        .setUri("http://httpbin.org")
        .setEntity(entityProducer)
        .build();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM