HttpClient请求POST提示302,并且返回的response中的Localtion是我访问时使用的URL,json
例如:我使用的URL是https://bbs.csdn.net?client_id=10333user=test,app
localtion中也是这个https://bbs.csdn.net?client_id=10333user=testcurl
我试了直接使用curl能够返回jsonpost
个人post方法:ui
public static StringBuilder post(String url, Object data, String encoding) {url
log.info(HttpClient post start = +url);.net
CloseableHttpResponse response = null;debug
HttpPost httpPost = null;code
HttpHost httpHost = null;orm
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方式传参处理
Mapparams = (Map) data;
Listnvps = new ArrayList();
if (!Stringer.isNullOrEmpty(data)) {
SetkeySet = 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=10333user=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”);
至此问题解决!