一.搭建环境
使用MyEclipse创建一个工程(web工程或java工程),把“httpClient所需jar包”目录下边的jar包都引入新创建的工程后,环境就搭建完成了。
二.httpClient Post请求
private String postClient(String actionUrl)throws Exception{
HttpClient httpclients = new HttpClient();
//防止https请求终止
Protocol myhttps = new Protocol("https", new
MySecureProtocolSocketFactory(), 443);
Protocol.registerProtocol("https", myhttps);
//创建post模型
PostMethod postmethod = new PostMethod(actionUrl);
postmethod.addRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=gbk");
postmethod.setRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
postmethod.getParams().setContentCharset("gbk");
postmethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, false));
postmethod.addParameter("orderTime", "");//post参数,可增加多个参数
//7.发送报文
httpclients.executeMethod(postmethod);
System.out.println("------- 客户端请求完毕 -------");
// byte[] responsbody = postmethod.getResponseBody(); //获得服务器返回信息
String retValue = postmethod.getResponseBodyAsString(); //获得服务器返回信息,以字符串形式返回
return retValue;
}
三.httpClient Get请求
private String getClient(String actionUrl)throws Exception{
HttpClient httpclients = new HttpClient();
//防止https请求终止
Protocol myhttps = new Protocol("https", new DefaultProtocolSocketFactory(), 443);
Protocol.registerProtocol("https", myhttps);
//创建get模型
GetMethod getmethod = new GetMethod(actionUrl);
getmethod.addRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=gbk");
getmethod.setRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
getmethod.getParams().setContentCharset("gbk");
getmethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, false));
//7.发送报文
httpclients.executeMethod(getmethod);
System.out.println("------- 客户端请求完毕 -------");
// byte[] responsbody = postmethod.getResponseBody(); //获得服务器返回信息
String retValue = getmethod.getResponseBodyAsString();//获得服务器返回信息,以字符串形式返回
return retValue;
}
四.httpClient 访问https连接,注册证书
有些时候需要通过https协议访问服务器,这时就存在一个证书验证的问题。
笔者一般证书验证问题分为三类:
1.第一类比较好解决
有一些https访问时可以通过增加两行代码来设置“不验证服务器”,以达到成功访问的目的。//防止https请求终止
Protocol myhttps =
new Protocol("https", new DefaultProtocolSocketFactory(), 443);
Protocol.registerProtocol("https", myhttps);
2.第二类客户端验证服务器
即:客户端在发起请求时,会验证服务器连接是否是信任的。如果在java的keystore中找不到服务器证书,则认为此服务器连接不被信任,请求终止。
解决方法:
第一步:通过浏览器下载导出服务器证书,一般为.cer 或 .crt 格式,通过java自带的keytool 命令将证书导入到cacerts 文件中。 具体操作,详见《https访问java证书注册》文档
第二步:增加一下两行代码
//防止https请求终止
Protocol myhttps =
new Protocol("https", new DefaultProtocolSocketFactory(), 443);
Protocol.registerProtocol("https", myhttps);
3.第三类客户端验证服务器,服务器验证客户端
即:客户端在发起请求时,会验证服务器连接是否是信任的。如果在java的keystore中找不到服务器证书,则认为此服务器连接不被信任,请求终止。如果客户端验证通过,请求发到服务器端,服务器也要做类似的验证,验证客户端是否被信任。如果客户端属于信任列表,则允许请求。否则请求终止。
解决方法:
第一步:获得客户端证书
客户端证书应和服务提供商联系,得到客户端证书。一般格式为:.pfx 或 .p12 格式。
第二步:获得服务端证书
通过浏览器下载或和服务提供商联系联系,得到服务器证书。一般为.cer 或 .crt 格式。
第三步:我们需要将服务器证书导入到keystore中,在这里我们新建一个keystore。使用keytool命令可以新建。或者使用《修改keystoreGUI工具》进行新建。必须为jks格式。密码自行设置。我这里keystore名字为:joyoService.jks,设置密码为:password;新建成功后,将服务器证书导入到joyoService.jks中。
第四步:代码修改
//注册证书
Protocol authhttps = new Protocol("https",
new AuthSSLProtocolSocketFactory(
new URL("file:///C:/certificate/client/joyo.p12"), "password","pkcs12",//客户端
new URL("file:///c:/certificate/joyoService.jks"), "password","jks"), 443); //服务端
Protocol.registerProtocol("https", authhttps);
几行代码需要解释一下,第三行注册客户端证书,
第一个参数:
new URL("file:///C:/certificate/client/joyo.p12") //客户端证书url
第二个参数:"password" //客户端证书密码
第三个参数:"pkcs12" //客户端证书格式,不用修改
第四行注册服务端证书,
第一个参数:
new URL("file:///c:/certificate/joyoService.jks") //服务端keystore url
第二个参数:"password" //服务端keystore 密码
第三个参数:"jks" //服务端keystore 格式,不用修改