您的位置 首页 > 数码极客

java如何解析post请求 JAVA post请求设置请求头

1.Post请求失败的代码

try { HttpResponse response = (httpPost); HttpEntity entity = re(); result = En(entity, "UTF-8"); U("API,POST回来的数据是:"); U(result); } catch (ConnectionPoolTimeoutException e) { log.e("http get throw ConnectionPoolTimeoutException(wait time out)"); } catch (ConnectTimeoutException e) { log.e("http get throw ConnectTimeoutException"); } catch (SocketTimeoutException e) { log.e("http get throw SocketTimeoutException"); } catch (Exception e) { log.e("http get throw Exception"); } finally { (); }

之前每次代码执行到上述代码的第二行的时候,会等一段时间然后会捕获到Exception异常。

2.分析问题

当然捕获的Exception这个异常太大了我们不便于分析,我们查看一下(HttpUriRequest uri)的方法;

发下这个方法会抛出IOException, ClientProtocolException这两个异常,但是在调用方法的时候并没有明确捕获他们两个。

3.得出结论

所以很有可能在执行post请求的过程中,遇到了这两个问题,果然我们把代码完善之后

try { httpClient = new SSLClient(); HttpResponse response = (httpPost); HttpEntity entity = re(); result = En(entity, "UTF-8"); U("API,POST回来的数据是:"); U(result); } catch (ConnectionPoolTimeoutException e) { log.e("http get throw ConnectionPoolTimeoutException(wait time out)"); } catch (ConnectTimeoutException e) { log.e("http get throw ConnectTimeoutException"); } catch (SocketTimeoutException e) { log.e("http get throw SocketTimeoutException"); } catch (ClientProtocolException e) { log.e("http get throw ClientProtocolException"); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { log.e("http get throw Exception"); } finally { (); }

上述,完善完毕代码后捕捉到了IOException异常,我们把异常打印出来看到了如下信息。

4.解决问题

通过在网上查询可知,这是缺少安全证书时出现的异常,解决方案如下:

  1. 等待Oracle/Google/Mozilla等等组织信任CNNIC,算了,洗洗睡吧
  2. 使用Java的TrustManager忽略所有的SSL请求的证书,仅仅用于开发测试,限于篇幅不做介绍了
  3. 导入目标网站的证书,然后在开始调用之前,指定keystore就ok了,本文介绍下该方法

目前我们采用第二种方案:由于请求的URL是HTTPS的,为了避免需要证书,所以用一个类继承DefaultHttpClient类,忽略校验过程。

编写一个SSLClient类

package com.; import java.; import java.; import javax.net.; import javax.net.; import javax.net.; import org.a; import org.a; import org.aRegistry; import org.a; import org.a; public class SSLClient extends DefaultHttpClient { public SSLClient() throws Exception { super(); SSLContext ctx = SSLCon("TLS"); X509TrustManager tm = new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { // TODO Auto-generated method stub } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { // TODO Auto-generated method stub } @Override public X509Certificate[] getAcceptedIssuers() { // TODO Auto-generated method stub return null; } }; c(null, new TrustManager[] { tm }, null); SSLSocketFactory ssf = new SSLSocketFactory(ctx, SSLSocke); ClientConnectionManager ccm = (); SchemeRegistry sr = ccm.getSchemeRegistry(); (new Scheme("https", 443, ssf)); } }

对应的实现类:

public HttpResponse sendPostToService(String url, Object pushData) throws IOException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyManagementException { if (!hasInit) { init(); } String result = null; HttpPost httpPost = new HttpPost(url); StringEntity postEntity = new StringEntity(), Con("application/x-www-form-urlencoded", "UTF-8")); // 设置一些Http头信息 ("Content-Type", "application/x-www-form-urlencoded"); ("connection", "Keep-Alive"); ("user-agent", "Mozilla (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); // 将发送内容填装 (postEntity); // 设置请求器的配置 (requestConfig); // 打印待发送的数据 U("=====API,POST过去的数据是:"); U("executing request" + ()); U("请求头信息===" + ().toString()); U("请求状态行===" + ()); U("请求配置===" + ()); U("请求实体===" + ().getContentEncoding() + ().getContentType() + ().getContent()); HttpResponse response = null; try { // 忽略所有的SSL请求的证书 httpClient = new SSLClient(); response = (httpPost); HttpEntity entity = re(); result = En(entity, "UTF-8"); // 打印得到的响应信息 U("API,POST回来的数据是:"); U("=====Entity:" + result); U("=====Headers:" + re()); U("=====StatusLine:" + re()); U("=====Locale:" + re()); } catch (ConnectionPoolTimeoutException e) { log.e("http get throw ConnectionPoolTimeoutException(wait time out)"); } catch (ConnectTimeoutException e) { log.e("http get throw ConnectTimeoutException"); } catch (SocketTimeoutException e) { log.e("http get throw SocketTimeoutException"); } catch (ClientProtocolException e) { log.e("http get throw ClientProtocolException"); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { log.e("http get throw Exception"); } finally { (); } return response; }

在第36行使用自定义的SSLClient来忽略掉验证要求

另外注意在postMan中模拟调用的时候我们是用的x-www-form-urlencoded格式的数据请求,就是application/x-www-from-urlencoded,会将表单内的数据转换为键值对。

当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2...),然后把这个字串append到url后面,用?分割,加载这个新的url。 当action为post时候,浏览器把form数据封装到http body中,然后发送到server。

所以我们需要对传进来的数据做一下处理:

// 拼接x-www-form-urlencoded格式的请求参数 String www_url = "coverimg=" + () + "&mode=" + () + "&msgcontent=" + () + "&msgtype=" + () + "&outline=" + () + "&saveRecord=" + () + "&source=" + () + "&ticker=" + () + "×tamp=" + () + "&title=" + () + "&uid=" + () + "&url=" + (); logger.info("x-www-form-urlencoded格式的请求参数为:" + www_url);

最后效果如下:

我是「翎野君」,感谢各位朋友的:点赞、收藏和评论,我们下期见。

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“java如何解析post请求,JAVA,post请求设置请求头,JAVA发送post请求,JAVA,post请求传参编码”边界阅读