我尝试从简单的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
有人可以告诉我我的代码有什么问题吗?
由于
答案 0 :(得分:2)
默认情况下,只会自动跟踪导致重定向的GET
次请求。如果使用POST
或HTTP 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请求。