gpt4 book ai didi

java - Apache HttpComponents 忽略重定向上的 POST 数据 (HTTP 302)

转载 作者:行者123 更新时间:2023-12-02 10:51:50 24 4
gpt4 key购买 nike

我正在使用Apache HttpComponents连接到其他公司的 API。

这家公司的服务器正在将我的 POST 请求重定向到另一个位置,因此我必须配置 HttpComponents 以允许循环重定向:

private RequestConfig defaultRequestConfig = RequestConfig.custom()
.setCookieSpec(CookieSpecs.DEFAULT)
.setCircularRedirectsAllowed(true)
.build();

private CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultRequestConfig(defaultRequestConfig)
.setRedirectStrategy(CustomRedirectStrategy.INSTANCE)
.build();

GET 请求工作正常,但是当我尝试 POST 时,HttpComponents 似乎忽略了我尝试发送的正文。下面是我用来 POST 的代码,也是 HttpComponents 生成的(恢复的)日志:

public CloseableHttpResponse doPOST(String url, String stringEntity) throws IOException {
HttpPost request = new HttpPost(url);
request.setEntity(new StringEntity(stringEntity));
request.setHeader("Accept", "application/json;");
request.setHeader("Content-type", "application/json;");
return httpclient.execute(request);
}

-> POST (http://some-server.com/api/test) (Content-Length: 65)
<- 302 (https://some-server.com/api/test)

-> POST (https://some-server.com/api/test) (Content-Length: 0)
<- 302 (http://some-server.com/api/test)

-> POST (http://some-server.com/api/test) (Content-Length: 0)
<- 302 (https://some-server.com/api/test)

-> POST (https://some-server.com/api/test) (Content-Length: 0)
<- 404 (Not Found)

->用于我发送的消息,并且 <-用于收到的消息

我看到第一个 POST 的内容长度为 65,但重定向后的 POST 却没有。

重定向后 HttpComponents 是否忽略我的 POST 实体?如果是这样,我如何配置它以在重定向时发送此数据?

观测值:CustomRedirectStrategy是我创建的一个类,它从 LaxRedirectStrategy 扩展而来并覆盖#getRedirect将 POST 方法重定向到 POST,而不是 GET。

最佳答案

要将数据从原始 POST 重新发布到重定向,我们可以实现特定的重定向策略,覆盖 #getRedirect:

@Contract(threading = ThreadingBehavior.IMMUTABLE)
public class CustomRedirectStrategy extends LaxRedirectStrategy {

public static final CustomRedirectStrategy INSTANCE = new CustomRedirectStrategy();

@Override
public HttpUriRequest getRedirect(
final HttpRequest request,
final HttpResponse response,
final HttpContext context) throws ProtocolException {
final URI uri = getLocationURI(request, response, context);
final String method = request.getRequestLine().getMethod();
if (method.equalsIgnoreCase(HttpHead.METHOD_NAME)) {
return new HttpHead(uri);
} else if (method.equalsIgnoreCase(HttpGet.METHOD_NAME)) {
return new HttpGet(uri);
} else if (method.equalsIgnoreCase(HttpPost.METHOD_NAME)) {
return RequestBuilder.copy(request).setUri(uri).build(); // Here
} else {
final int status = response.getStatusLine().getStatusCode();
if (status == HttpStatus.SC_TEMPORARY_REDIRECT) {
return RequestBuilder.copy(request).setUri(uri).build();
} else {
return new HttpGet(uri);
}
}
}

}

对于POST方法,根据原始请求返回一个请求。

为此,您必须在 HttpClient 实例上设置此重定向策略:

public CloseableHttpClient getHttpClient() {
return HttpClients.custom()
.setDefaultRequestConfig(defaultRequestConfig)
.setRedirectStrategy(CustomRedirectStrategy.INSTANCE) // Here
.build();
}

关于java - Apache HttpComponents 忽略重定向上的 POST 数据 (HTTP 302),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52120133/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com