对梦想的牵挂 2019-03-26 18:06 采纳率: 0%
浏览 2270

HttpClient请求POST提示302,而且返回的response中的Localtion是我访问时使用的URL?

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"

大神们帮忙看看吧

  • 写回答

1条回答 默认 最新

  • 对梦想的牵挂 2019-04-03 16:48
    关注

    找到原因了,未指定https协议。修改为httpHost = new HttpHost(_url.getHost(),_url.getPort(),“https”);就可以了

    评论

报告相同问题?

悬赏问题

  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办