当前位置: 首页 > 知识库问答 >
问题:

Apache HttpClient 4.5将POST请求重定向到GET请求

李博达
2023-03-14

我试图点击一个postendpoint,但它给出了错误302,当我在同一台服务器上尝试另一个get Url时,它给出了200。然后,我使用laxrirectstrategy()重定向了post请求。post请求正在重定向到get请求(只有同一个endpoint的方法名是get和post),它没有从post方法获得响应。有人能告诉我如何使用apahce httpClient 4.5将post请求重定向到post请求吗

HttpClient client= HttpClientBuilder.create()
 .setRedirectStrategy(new LaxRedirectStrategy()).build();
HttpPost post = new HttpPost("url");
post.addHeader("content-type", " application/json");
HttpResponse response = client.execute(post);

共有2个答案

督嘉言
2023-03-14
    HttpClient httpClient =
        HttpClients.custom().setRedirectStrategy(new LaxRedirectStrategy() {

            /*
             * (non-Javadoc)
             * 
             * @see org.apache.http.impl.client.DefaultRedirectStrategy#
             * getRedirect(org.apache.http.HttpRequest,
             * org.apache.http.HttpResponse,
             * org.apache.http.protocol.HttpContext)
             */
            @Override
            public HttpUriRequest getRedirect(
                HttpRequest request, HttpResponse response,
                HttpContext context) throws ProtocolException
        {

                final URI uri = getLocationURI(request, response, context);
                final String method = request.getRequestLine().getMethod();
                if (method.equalsIgnoreCase(HttpPost.METHOD_NAME)) {

                    HttpPost post = new HttpPost(uri);
                    post.setEntity(entity);
                    return post;
                } else if (method.equalsIgnoreCase(HttpHead.METHOD_NAME)) {
                    return new HttpHead(uri);
                } else if (method.equalsIgnoreCase(HttpGet.METHOD_NAME)) {
                    return new HttpGet(uri);
                } else {
                    final int status =
                        response.getStatusLine().getStatusCode();
                    return status == HttpStatus.SC_TEMPORARY_REDIRECT
                        ? RequestBuilder.copy(request).setUri(uri).build()
                        : new HttpGet(uri);
                }
            }

        })
公胤运
2023-03-14

我有相同的问题,我解决了它通过使用LaxReDirectStrategy与重写getReDirect方法。

显然,POST请求的默认行为是当初始重定向响应不同于307或308时,将重定向调用作为GET请求。

请参阅:LaxRedirectStrategy继承的DefaultRedirectStrategy。

在我的例子中,重定向响应代码是302。

因此,如果你想要一些不同的东西,你可以重写getRedirect方法并提供你自己的实现。

类似的东西:

new LaxRedirectStrategy() {
        @Override
        public HttpUriRequest getRedirect(HttpRequest request, HttpResponse response, 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 {
                final int status = response.getStatusLine().getStatusCode();
                if (status == HttpStatus.SC_TEMPORARY_REDIRECT || status == HttpStatus.SC_MOVED_TEMPORARILY) { //HttpStatus.SC_MOVED_TEMPORARILY == 302
                    return RequestBuilder.copy(request).setUri(uri).build();
                } else {
                    return new HttpGet(uri);
                }
            }
        }
    }
 类似资料:
  • 主要内容:获取GET请求内容,实例,实例,获取 POST 请求内容,基本语法结构说明,实例在很多场景中,我们的服务器都需要跟用户的浏览器打交道,如表单提交。 表单提交到服务器一般都使用 GET/POST 请求。 本章节我们将为大家介绍 Node.js GET/POST请求。 获取GET请求内容 由于GET请求直接被嵌入在路径中,URL是完整的请求路径,包括了?后面的部分,因此你可以手动解析后面的内容作为GET请求的参数。 node.js 中 url 模块中的 parse 函数提供了这个

  • 在很多场景中,我们的服务器都需要跟用户的浏览器打交道,如表单提交。 表单提交到服务器一般都使用 GET/POST 请求。 本章节我们将为大家介绍 Node.js GET/POS T请求。 获取GET请求内容 由于GET请求直接被嵌入在路径中,URL是完整的请求路径,包括了?后面的部分,因此你可以手动解析后面的内容作为GET请求的参数。 node.js 中 url 模块中的 parse 函数提供了这

  • 我将spring saml扩展与Apache2.2+Tomcat7.0+OKTA(IdP)一起使用。securitycontext.xml如下所示: MetadataGeneratorFilter: 谢谢 奈良 HTTP请求转储:

  • 问题内容: 谁能给我指出发送GET和POST请求的一种很好的实现方式。他们有很多方法可以做到这些,我正在寻找最佳的实现方式。其次,有一种通用的方法可以发送这两种方法,而不是使用两种不同的方法。毕竟,GET方法仅在查询字符串中具有参数,而POST方法使用这些参数的标头。 谢谢。 问题答案: 您可以使用该类(在java.net中)发送POST或GET HTTP请求。它与可能要发送HTTP请求的任何其他

  • 问题内容: 我在使用OAuth编写的应用程序中使用了许多HTTP请求。目前,我以相同的方式发送GET和POST请求: 这工作正常。我成功地发布和获取。但是,我担心我没有正确执行POST。我需要在上面的代码中包含以下if语句吗? 如果是这样,为什么?有什么不同?我将不胜感激任何反馈。 谢谢! 问题答案: 内容类型必须与的 实际 格式匹配。仅当内容类型实际经过url编码时,才需要内容类型。例如,您对P

  • 我们的整个网站将通过https提供服务。我在每条路线上都有“https”。但是,如果他们试图通过http将其重定向到https,我该如何将其重定向到https?