HttpClient常用的一些常识
HttpClient是目前我们通讯组件中最常见的一个Api了吧。至少从我目前接触到与外部系统通讯的话是这样的。下面我将我自己常用的一些知识总结一下。
因为本猿也是边写边总结,有啥不对的还望多多指出。
1:利用httpClient发送https请求。
第一次遇到这种情况是开发与微信支付的接口。适用情形https请求,报文格式:字符串(包含json字符串和xml字符串)。
public String doPost(String url,String charset,String reqXmlData){
HttpClient httpClient = null;
HttpPost httpPost = null;
String result = null;
try{
//这里是关键,SSLClient继承了DefaultHttpClient 忽略https校验过程。SSLClient具体如下。
httpClient = new SSLClient();
logger.info("call weixin pay url:"+url);
httpPost = new HttpPost(url);
logger.info("call weixin pay requestXmlData:"+reqXmlData);
//设置最简单的字符串请求参数
StringEntity strEntity = new StringEntity(reqXmlData, charset);
httpPost.setEntity(strEntity);
HttpResponse response = httpClient.execute(httpPost);
int code = response.getStatusLine().getStatusCode();
if(code == 200){
HttpEntity resEntity = response.getEntity();
if(resEntity != null){
result = EntityUtils.toString(resEntity,charset);
}
}else{
//这里就不对其他code处理了
}
logger.info("call weixin pay responseXmlData:"+result);
}catch(Exception ex){
ex.printStackTrace();
}finally{
if (httpClient != null){
httpClient = null;
}
}
return result;
}
/**
* 用于进行Https请求的HttpClient
*/
public class SSLClient extends DefaultHttpClient{
public SSLClient() throws Exception{
super();
SSLContext ctx = SSLContext.getInstance("TLS");
X509TrustManager tm = new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
ctx.init(null, new TrustManager[]{tm}, null);
SSLSocketFactory ssf = new SSLSocketFactory(ctx,SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
ClientConnectionManager ccm = this.getConnectionManager();
SchemeRegistry sr = ccm.getSchemeRegistry();
sr.register(new Scheme("https", 443, ssf));
}
}
好了,今天就先更新到这里了。下班肥家。20151207
第二点:利用httpclient来模拟表单提交(兼容http请求和https请求)
相信有很多人遇到过和我一样的情形,与外部系统对接时。经常是测试环境使用的是http请求而生产正式环境则是https请求。这时候我是这样做的。
public static String httpPost(String reqUrl, BaseDto baseDto){
DefaultHttpClient httpclient = new DefaultHttpClient();
String result = "";
try {
if(reqUrl.startsWith("https")){
logger.debug("请求地址为https请求");
httpclient = new SSLClient();
}
//设置超时时间
httpclient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, TIME_OUT * 1000);
httpclient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, TIME_OUT * 1000);
HttpPost httppost = new HttpPost(reqUrl);
logger.debug("调用地址"+reqUrl);
//定义一个用来存储表单数据的集合
List<BasicNameValuePair> formParams = new ArrayList<BasicNameValuePair>();
formParams.add(new BasicNameValuePair("merchant_id", baseDto.getMerchant_id()));
formParams.add(new BasicNameValuePair("key_enc", baseDto.getKey_enc()));
formParams.add(new BasicNameValuePair("sign", baseDto.getSign()));
formParams.add(new BasicNameValuePair("xml_enc", baseDto.getXml_enc()));
//UrlEncodedFormEntity与StringEntity相比较的话只能接受键值对的形式,试用与表单提交
HttpEntity entity = new UrlEncodedFormEntity(formParams, "UTF-8");
httppost.setEntity(entity);
HttpResponse response=httpclient.execute(httppost);
int httpCode = response.getStatusLine().getStatusCode();
logger.debug("返回的code:"+httpCode);
switch (httpCode) {
case 200:
HttpEntity resEntity=response.getEntity();
result = EntityUtils.toString(resEntity,"UTF-8");
logger.debug("通讯原始结果:"+result);
return result;
case 401:
logger.debug("请求要求进行身份验证");
case 403:
logger.debug("请求被拒绝,请检查IP地址是否已经加入对方白名单");
case 404:
logger.debug("未找到,服务器找不到请求的地址");
case 405:
logger.debug("方法不允许,请确认是否为POST请求方式");
case 500:
logger.debug("查询请求失败,内部错误");
default:
logger.debug("未知的返回码:" + httpCode);
}
} catch (Exception e) {
e.printStackTrace();
throw new ServiceException(e,"0006","获取渠道返回信息失败了,可能是超时了");
}
}
好了,今天就先更新到这里了,后面继续来整理利用httpclient来进行爬虫。httpclient的超时设置等等。20151208
HttpClient常用的一些常识的更多相关文章
- Go - httpclient 常用操作
httpclient 模块介绍 httpclient 是基于 net/http 封装的 Go HTTP 客户端请求包,支持常用的请求方式.常用设置,比如: 支持设置 Mock 信息 支持设置失败时告 ...
- 常用javaScript小常识
javascript数据类型强制转换 一.转换为数值类型 Number(参数) 把任何的类型转换为数值类型 A.如果是布尔值,false为0,true为1 B.如果是数字,转换成为本身.将无意义的后导 ...
- HTTPClient模块的HttpGet和HttpPost
HttpClient常用HttpGet和HttpPost这两个类,分别对应Get方式和Post方式. 无论是使用HttpGet,还是使用HttpPost,都必须通过如下3步来访问HTTP资源. 1.创 ...
- HttpClient研究学习总结
Http协议非常的重要,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且也方便了开发人 ...
- java使用HttpClient
HttpClient常用的包有两个 org.apache.http.client以及org.apache.commons.httpclient 我常用的是org.apache.http.client. ...
- 8.3 TCPIP协议族
接下来我们要学习的内容是TCP/IP协议族.TCP/IP协议族在网络系统中是非常重要的.这一个协议族当中牵涉到许许多多的我们平常所用到的协议.TCP/IP呢它也有分层模型.然后我们讲到的就是三方面的内 ...
- spring整合http
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接出处:https://blog.csdn.net/qq_3076499,否则保留追究法律责任的权利. 如果 ...
- C#网络程序设计(1)网络编程常识与C#常用特性
网络程序设计能够帮我们了解联网应用的底层通信原理! (1)网络编程常识: 1)什么是网络编程 只有主要实现进程(线程)相互通信和基本的网络应用原理性(协议)功能的程序,才能算是真正的网 ...
- .Net Standard HttpClient封装Htt请求常用操作整理
一.常用Http操作 1.Get请求,有参数,无参数 2.Post 请求,有参数,无参数 3.文件简单下载 修改NetHelper中Post请求方法Bug:请求编码默认UTF8,字符串内存流读取后这是 ...
- Httpclient 表单,json,multipart/form-data 提交 ---总结常用的方法
最近在项目中,一直在使用HttpClient 中的方法,这里我进行一些方法的汇总,也是结合了一些大牛写的代码,以备不时之需 官话:HttpClient 是Apache Jakarta Common 下 ...
随机推荐
- kubebuilder简明教程
一.operator概述 Operator 是 Kubernetes 的扩展软件,它利用 定制资源 管理应用及其组件. Operator 遵循 Kubernetes 的理念,特别是在控制器 方面[1] ...
- APP压力稳定性测试-Monkey
一.Monkey工具简介 1.monkey的来源: Monkey是一个命令行工具,使用安卓调试桥(adb)来运行它,模拟用户:触摸屏幕.滑动Trackball.按键等随机事件流来对设备上的程序进行压力 ...
- Jmeter 如何把 时间戳 转为 本地时间
一.引入主题(time) jmeter中,有很多已经封装好的函数,使用这些函数,就能实现某些特定的功能,这对于没有代码基础,或代码基础薄弱的同学来说,是一个非常大的福音. 二.Jmeter把时间戳转为 ...
- 【9】java之static关键字
一. static 定义属性 static 定义的属性和非 static 定义的属性有一个最大区别:所有的非 static 属性必须产生实例化对象之后才可以访问,static 定义的属性不受此限制.也 ...
- HashMap排序题
HashMap排序题 题目 已知一个 HashMap<Integer,User>集合, User 有 name(String)和 age(int)属性. 请写一个方法实现对HashMap ...
- Mysql数据库基础第五章:(二)视图
Mysql数据库基础系列 软件下载地址 提取码:7v7u 数据下载地址 提取码:e6p9 mysql数据库基础第一章:(一)数据库基本概念 mysql数据库基础第一章:(二)mysql环境搭建 mys ...
- Python控制台输出字体颜色及背景设置
python 可以利用命令输出带有特效的控制台字体 基础语法 Python利用'\033[<style CODE>;<fore color CODE>;< back co ...
- OpenGL错误记录
OpenGL3之--三角形(无法解析的外部符号 __imp__glClear@4,该符号在函数 _main 中被引用) 添加头文件 #include <GL/glut.h>
- vue中input触发方法中调用ajax,导致input失去焦点问题
发现在vue中监控input绑定的值,调用方法时,如果方法中有调用后端接口(使用Ajax),会导致input输入框失去焦点,这样导致的问题就是每输入一个字符,就要重新聚焦一次,可通过以下方式在方法中重 ...
- oralce 语句指定的转换无效
公司的小师妹出现了个问题 让我帮忙看一下 在plsql 中查询语句没问题, 但是放到程序中会提示指定的转换无效 是因为存在无限小数 加上round(JJYHL,2) JJYHL就可以了