繁体   English   中英

Apache HttpComponents忽略重定向时的POST数据(HTTP 302)

[英]Apache HttpComponents ignoring POST data on redirect (HTTP 302)

我正在使用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的Content-Length为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();
}

暂无
暂无

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

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