使用CloseableHttpClient发出POST请求

时间:2018-03-02 09:54:01

标签: java apache-httpclient-4.x

我尝试从简单的Java Project创建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

有人可以告诉我我的代码有什么问题吗?

由于

1 个答案:

答案 0 :(得分:2)

默认情况下,只会自动跟踪导致重定向的GET次请求。如果使用POSTHTTP 301 Moved Permanently回复302 Found次请求,则不会自动执行重定向。

这是由HTTP RFC 2616指定的:

  

如果收到301状态代码以响应除以外的请求   GET或HEAD,用户代理不得自动重定向   除非可以由用户确认,否则请求,因为这可能   改变发出请求的条件。

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

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

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

并使用它来管理POST请求。