【问题标题】:POST Request with CloseableHttpClient使用 CloseableHttpClient 发布请求
【发布时间】:2018-03-02 21:21:13
【问题描述】:

我正在尝试从一个简单的 Java 项目创建一个 HTTP POST 请求。

我需要通过两个请求来保持会话和 cookie,所以我选择了Apache HttpClient

代码编译没有错误并运行,但它返回一个零长度的内容,我不明白为什么。

public class Test {

    private static final String CONTENT_TYPE = "Content-Type";
    private static final String FORM_URLENCODED = "application/x-www-form-urlencoded";

    public static void main(String[] args) {

        try {

            CloseableHttpClient httpClient = HttpClients.createDefault();

            BasicHttpContext httpCtx = new BasicHttpContext();
            CookieStore store = new BasicCookieStore();
            httpCtx.setAttribute(HttpClientContext.COOKIE_STORE, store);

            String url = "http://myhost:port/app/";
            String body = "my body string";

            HttpPost httpPost = new HttpPost(url);
            httpPost.setHeader(CONTENT_TYPE, FORM_URLENCODED);
            StringEntity entity = new StringEntity(body);

            httpPost.setEntity(entity);
            CloseableHttpResponse response = httpClient.execute(httpPost, httpCtx);
            HttpEntity respentity = response.getEntity();

            System.out.println("respentity: " + respentity);

            System.out.println("EntityUtils.toString(respentity): " + EntityUtils.toString(respentity));

            EntityUtils.consume(respentity);

            System.out.println("respentity: " + respentity);
            System.out.println("EntityUtils.toString(respentity): " + EntityUtils.toString(respentity));

        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }

}

结果是:

respentity: [Content-Length: 0,Chunked: false]
EntityUtils.toString(respentity): 
respentity: [Content-Length: 0,Chunked: false]
EntityUtils.toString(respentity): 

已更新:我发现响应状态是 302(已找到),当我从 Postman 发出相同的请求时,它是 200(OK) >.

谁能告诉我我的代码有什么问题吗?

谢谢

【问题讨论】:

    标签: java apache-httpclient-4.x


    【解决方案1】:

    默认情况下,只有GET 导致重定向的请求会被自动跟踪。如果使用HTTP 301 Moved Permanently302 Found 回答POST 请求,则不会自动遵循重定向。

    这是由 HTTP RFC 2616 指定的:

    如果收到 301 状态代码以响应请求而不是 GET 或 HEAD,用户代理不能自动重定向 请求,除非它可以被用户确认,因为这可能 更改发出请求的条件。

    使用HttpClient 4.2(或更高版本),我们可以将重定向策略设置为LaxRedirectStrategy,该策略放宽了HTTP对POST方法自动重定向的限制规范。

    因此您可以使用如下方法创建CloseableHttpClient 实例:

    private CloseableHttpClient createHttpClient() {
        HttpClientBuilder builder = HttpClientBuilder.create();
        return builder.setRedirectStrategy(new LaxRedirectStrategy()).build();
    }
    

    并用它来管理 POST 请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 1970-01-01
      • 2013-07-15
      • 2015-02-16
      • 2013-02-22
      • 2015-05-08
      • 1970-01-01
      相关资源
      最近更新 更多