HttpClient请求POST提示302,直接使用curl可以返回json,怎么修改HttpClient

对梦想的牵挂 2019-03-26 05:51:33
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"

大神们帮忙看看吧
...全文
640 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
对梦想的牵挂 2019-04-03
  • 打赏
  • 举报
回复
找到原因了,未指定https协议。修改为httpHost = new HttpHost(_url.getHost(),_url.getPort(),“https”); 就可以了
对梦想的牵挂 2019-03-28
  • 打赏
  • 举报
回复
试过了。不是url的问题
对梦想的牵挂 2019-03-27
  • 打赏
  • 举报
回复
引用 3 楼 tianfang 的回复:
从http头Location 中读取跳转url,打开跳转url

这个试过,location中的url和我请求的地址一样,还是302
tianfang 2019-03-27
  • 打赏
  • 举报
回复
从http头Location 中读取跳转url,打开跳转url
tianfang 2019-03-27
  • 打赏
  • 举报
回复
你的demo url 有get方式传递参数,是不是这个引起的
对梦想的牵挂 2019-03-27
  • 打赏
  • 举报
回复
引用 1 楼 tianfang 的回复:
302是跳转,自己判断一下是否是302,然后再次打开页面即可

https://blog.csdn.net/bwgang/article/details/8576021


我试了再次请求,可是给我返回的重定向地址和之前我请求的地址是一样的,再次请求也同样是302。。。。无限月读了
tianfang 2019-03-27
  • 打赏
  • 举报
回复
302是跳转,自己判断一下是否是302,然后再次打开页面即可 https://blog.csdn.net/bwgang/article/details/8576021

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧