HttpClient的POST请求提示302问题解决

当使用HttpClient进行POST请求时,遇到302重定向问题,Location头返回的URL与请求URL相同。通过查看官方文档,发现HttpHost构造方法如果不指定协议,默认会使用http。解决方案是使用带协议的HttpHost构造方法,明确指定协议为https,如HttpHost(_url.getHost(), _url.getPort(), "https"),问题得到解决。" 81481622,7578116,C#中String与StringBuilder的内存管理与使用场景,"['C#编程', '内存管理', '字符串处理', '性能', 'StringBuilder']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HttpClient请求POST提示302,而且返回的response中的Localtion是我访问时使用的URL,
例如:我使用的URL是https://bbs.csdn.net?client_id=10333&user=test,
localtion中也是这个https://bbs.csdn.net?client_id=10333&user=test

我试了直接使用curl可以返回json
我的post方法:

public static StringBuilder post(String url, Object data, String encoding) {
        log.info("HttpClient post start => "+url);
        CloseableHttpResponse response = null;
        HttpPost httpPost = null;
        HttpHost httpHost = null;
        StringBuilder responseEntity = null;
        String strings = "";

            URL _url = new URL(url);

            httpPost = new HttpPost(url);

            httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded");

            if(!Stringer.isNullOrEmpty(data)){

                log.debug("HttpClient post url => "+url+", data:"+JSON.toJSONString(data));

                if (data instanceof Map) {
                    // Map方式传参处理
                    Map<String,String> params = (Map<String,String>) data;

                    List<NameValuePair> nvps = new ArrayList<NameValuePair>();
                    if (!Stringer.isNullOrEmpty(data)) {
                        Set<String> keySet = params.keySet();
                        for (String key : keySet) {
                            nvps.add(new BasicNameValuePair(key, params.get(key)));
                        }
                    }
                    httpPost.setEntity(new UrlEncodedFormEntity(nvps, encoding));

                } else if(data instanceof String){
                    // String方式传参处理
                    strings = (String)data;
                    strings = Stringer.nullToEmpty(strings);
                    ByteArrayEntity reqEntity = new ByteArrayEntity(strings.getBytes(encoding));
                    reqEntity.setContentEncoding(encoding);
                    httpPost.setEntity(reqEntity);
                }
            }

            httpPost.setConfig(defaultRequestConfig);

            httpHost = new HttpHost(_url.getHost(),_url.getPort());  
            response = httpClient.execute(httpHost,httpPost);

            if(!Stringer.isNullOrEmpty(response)){
                log.info("2--HttpClient response  => "+response);
                log.info("3--HttpClient StatusCode  => "+response.getStatusLine().getStatusCode());
                /*if (response.getStatusLine().getStatusCode() != 200) {
                    return null;
                }*/
                String locationUrl=response.getLastHeader("location").getValue();
                log.info("HttpClient locationUrl  => "+locationUrl);
                log.info("4--HttpClient StatusCode  => "+response.getStatusLine().getStatusCode());

                if (response.getStatusLine().getStatusCode() == 302) {
                    Header header = response.getFirstHeader("location"); // 跳转的目标地址是在 HTTP-HEAD上
                    String newuri = header.getValue(); // 这就是跳转后的地址,再向这个地址发出新申请
                    System.out.println(newuri);

                    httpPost = new HttpPost(newuri);
                    httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded");


                    response = httpClient.execute(httpHost,httpPost);
                    int code = response.getStatusLine().getStatusCode();
                    locationUrl=response.getLastHeader("location").getValue();
                    log.info("5--HttpClient new Code  => "+code);
                    log.info("6--HttpClient locationUrl  => "+locationUrl);
                }
                responseEntity = new StringBuilder();
                responseEntity.append(EntityUtils.toString(response.getEntity(), encoding));
                return responseEntity;
            }

        return null;
    }

curl命令样例:

curl -k -d “client_id=10333&user=test” “https://bbs.csdn.net

原因:
官方文档中对HttpHost(String hostname,int port)方法的说明:

HttpHost
public HttpHost(String hostname,
int port)
Constructor for HttpHost.
Parameters:
hostname - the hostname (IP or DNS name). Can be null.
port - the port. Value -1 can be used to set default protocol port

可见 如果不在方法里面增加协议会带上默认协议http
需要使用带协议的方法:HttpHost(String hostname, int port, Protocol protocol) ,并指定协议为https

httpHost = new HttpHost(_url.getHost(),_url.getPort(),“https”);

至此问题解决!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值