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

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"

大神们帮忙看看吧

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • zhang3710 阿龙Alone 2年前

    https://bbs.csdn.net?client_id=10333&user=test,
    地址栏后面跟?再加上属性名=属性值貌似是get的传参方式吧,怎么能用post?

    点赞 1 评论 复制链接分享
  • qq_37338761 对梦想的牵挂 2年前

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

    点赞 评论 复制链接分享

相关推荐