post html片段 302,HttpClient的POST请求返回302解决

a4c26d1e5885305701be709a3d33442f.png

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

例如:我使用的URL是https://bbs.csdn.net?client_id=10333user=test,

localtion中也是这个https://bbs.csdn.net?client_id=10333user=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方式传参处理

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());

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”);

至此问题解决!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值