为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

函数式编程 2022-12-15 10:54:02
我正在尝试点击一个 post 端点,但它给出了错误 302,当我在同一台服务器上尝试另一个 get Url 时,它给了我 200。然后我使用 LaxRedirectStrategy() 重定向了 post 请求 post 请求重定向到 get 请求(相同端点唯一的方法名称是 GET 和 POST)它没有从 post 方法获得响应。谁能告诉我如何使用 apahce httpClient 4.5 将发布请求重定向到发布请求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 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

我遇到了同样的问题,我通过使用LaxRedirectStrategy和覆盖的 getRedirect方法解决了它。

显然,当初始重定向响应不同于 307 或 308 时,POST 请求的默认行为是将重定向调用作为 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);

                }

            }

        }

    }


查看完整回答
反对 回复 2022-12-15
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

  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);

                }

            }


        })


查看完整回答
反对 回复 2022-12-15
  • 2 回答
  • 0 关注
  • 130 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信