HttpClient详细实例,Httoclient调用https实例,避免https SSL认证
用实例证明能力,避免空谈 #生活技巧# #职场沟通技巧# #面试沟通#
最近公司将原有的http协议接口,更改为了可支持https的双向接口,在查阅资料同时,将解决过程与大家分享。
使用的框架是Struts2,如有变动可自行修改相应代码。
首先,我们看看httpClient是个什么东西,它有什么作用,它能干嘛,它地基本用法?
百度介绍:http://baike.baidu.com/link?url=_gKuBTJc3HqNGmSEoXyVwW0mlUE2joDRWH8SbFzp0KvppAn63bFrNTzJEQkWVbLXQlAb-ermhwoLBORmnH_1Ta
基本使用详情①(转载):http://blog.csdn.net/wangpeng047/article/details/19624529
基本使用详情②(转载):http://blog.csdn.net/5iasp/article/details/8638800
--以上 基本可以让你对httpClient有个基本了解,也可以有个基本的使用。
httpClient是一个用于调用http协议的插件,要使用此插件需使用以下jar包:
commons-beanutils-1.8.0.jar
commons-codec.jar
commons-collections-3.2.jar
commons-lang-2.4.jar
commons-lang3-3.1.jar
commons-logging-1.1.1.jar
ezmorph-1.0.4.jar
httpclient-4.1.3.jar
httpclient-cache-4.1.3.jar
httpcore-4.1.4.jar
httpmime-4.1.3.jar
json-lib-2.4-jdk15.jar
以上jar下载地址:
http://download.csdn.net/detail/dcb_ripple/9477012
简单的的httpClient 使用,
1.httpClient 简单使用HttpPost调用http接口
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
public static void testHttpClient(){
HttpClient httpclient = new DefaultHttpClient();
String url ="http://192.168.10.215:8080/tnserver/property_manager/login";
try {
HttpPost httppost = new HttpPost(url);
List<NameValuePair> list = new ArrayList<NameValuePair>();
list.add(new BasicNameValuePair("username","admin"));
list.add(new BasicNameValuePair("password","123456"));
httppost.addHeader("Content-type", "application/x-www-form-urlencoded");
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list,"UTF-8");
httppost.setEntity(entity);
HttpResponse post= httpclient.execute(httppost);
if (post.getStatusLine().getStatusCode() == 200) {
String conResult = EntityUtils.toString(post.getEntity());
JSONObject sobj = new JSONObject();
sobj = JSONObject.fromObject(conResult);
System.out.println(sobj);
} else {
System.out.println("失败....");
}
}catch(Exception e){
e.printStackTrace();
}
}
java
运行
</pre><p></p><pre>
java
运行
以上这个例子很中规中矩,没有太多特殊处理的地方。
那如果想象一下,要传入的参数是一个JSON格式的数据呢?
例如在登陆时将用户名与密码已json格式传入,
格式如下:
{
"username":"admin",
"password":"admin"
}
====那这个时候如果再采用
List<NameValuePair> list = new ArrayList<NameValuePair>();list.add(new BasicNameValuePair("username","xxxx"));list.add(new BasicNameValuePair("password","xxxxx"));
的方式传参肯定是有问题的,因为它采用key/value的方式传值方式,与action中 ”getRequest().getParameter(“xxx”) “ 是一个道理
那么这个时候该怎么进行参数的传递呢?--看下面
2.httpClient 简单使用HttpPost 参数类型为JSON格式时
public static void testHttpClient1(){
HttpClient httpclient = new DefaultHttpClient();
String url ="http://192.168.10.215:8080/tnserver/property_manager/login";
try {
HttpPost httppost = new HttpPost(url);
httppost.addHeader("Content-type", "application/x-www-form-urlencoded");
JSONObject json = new JSONObject();
json.put("username", "admin@qq.com");
json.put("password", "123456");
StringEntity entity = new StringEntity(json.toString(),"UTF-8");
httppost.setEntity(entity);
HttpResponse post= httpclient.execute(httppost);
if (post.getStatusLine().getStatusCode() == 200) {
String conResult = EntityUtils.toString(post.getEntity());
JSONObject sobj = new JSONObject();
sobj = JSONObject.fromObject(conResult);
System.out.println(sobj);
} else {
System.out.println("失败....");
}
}catch(Exception e){
e.printStackTrace();
}finally{
}
}
java
运行
通过上面StringEntity entity 类的处理就可以实现传输JSON格式参数了。
是不是很简单,快试一试就知道了,上面的代码只需要Copy到自己的Main方法中就可以测试。。。。。
不过要注意测试之前请先弄清楚你的htpp接口根据接口进行相应更改
===========================================================
以上两个例子只可基于http协议,且服务器中没有设置身份认证的情况下。。。
服务器中有账户认证处理
具体如下:
public static void testHttpClient2(){
HttpClient httpclient = new DefaultHttpClient();
String url ="http://xxxxx:xxxxx/tnserver/property_manager/login";
try {
HttpPost httppost = new HttpPost(url);
CredentialsProvider credsProvider = new BasicCredentialsProvider();
UsernamePasswordCredentials creds = new UsernamePasswordCredentials("xxx", "xxx");
credsProvider.setCredentials(
new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT),
creds);
((DefaultHttpClient)httpclient).setCredentialsProvider(credsProvider);
httppost.addHeader("Content-type", "application/x-www-form-urlencoded");
JSONObject json = new JSONObject();
json.put("username", "xxxx");
json.put("password", "xxxxx");
StringEntity entity = new StringEntity(json.toString());
httppost.setEntity(entity);
HttpResponse post= httpclient.execute(httppost);
if (post.getStatusLine().getStatusCode() == 200) {
String conResult = EntityUtils.toString(post.getEntity());
JSONObject sobj = new JSONObject();
sobj = JSONObject.fromObject(conResult);
System.out.println(sobj);
} else {
System.out.println("失败....");
}
}catch(Exception e){
e.printStackTrace();
}finally{
}
}
java
运行
这个认证账户密码是在http服务器中设置,所以别说不知账户密码是什么,直接问接口提供方。
前提是对方告诉你这是一个基于http协议的接口,并且会有认证过程。
好,上面说了又一种旧版本的认证方式,这里直接附上 (注意这里的调用方式不一样,旧版本没有httpPost 而是PostMethod。。详情请百度。)
http://www.cnblogs.com/davidwang456/p/4062233.html
HTTPS如果略过证书认证过程
那又如果使用是基于HTTPS的呢?
HTTPS与HTTP有很大区别,它相比HTTP协议更安全,更高效。
HTTP与HTTP区别:http://blog.csdn.net/angussl/article/details/5557738
-正题:如何在调用时略过HTTPS 证书SSL认证过程
在调用https协议的的接口时都会遇到一个问题,那就是SSL证书怎么破,难道真的在本地安装?貌似有点不好弄,说实话我也不会.....
所以我们肯定是希望有这么一个东西,那就是可以在使用的时候忽略SSL认证的问题,那么这样我们就不必为SSL而苦恼。
代码:
package com.httpclicent;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;
public class MySSLSocketFactory extends SSLSocketFactory {
SSLContext sslContext = SSLContext.getInstance("TLS");
public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
super(truststore);
TrustManager tm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
sslContext.init(null, new TrustManager[] { tm }, null);
}
@Override
public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
}
@Override
public Socket createSocket() throws IOException {
return sslContext.getSocketFactory().createSocket();
}
public static HttpClient getNewHttpClient() {
try {
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null, null);
SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme("https", sf, 443));
ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);
return new DefaultHttpClient(ccm, params);
} catch (Exception e) {
return new DefaultHttpClient();
}
}
}
java
运行
=============================说明:此类是从别处找到,并非自己写出来的
有了这个Class一切都将不是问题,无需太大改动,只需要在创建HttpClicent时 使用 类中的getNewHttpClient即可
如下:
//1.创建httpClient对象 (使用https协议,需要略过ssl验证,这里使用MySSLSocketFactory)
HttpClient httpclient = MySSLSocketFactory.getNewHttpClient();
代码:
public static void testHttpClient3(){
HttpClient httpclient = MySSLSocketFactory.getNewHttpClient();
<span style="white-space:pre"></span>
String url ="http://xxxx:443/tnserver/property_manager/login";
try {
HttpPost httppost = new HttpPost(url);
CredentialsProvider credsProvider = new BasicCredentialsProvider();
UsernamePasswordCredentials creds = new UsernamePasswordCredentials("xxx", "xxx");
credsProvider.setCredentials(
new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT),
creds);
((DefaultHttpClient)httpclient).setCredentialsProvider(credsProvider);
httppost.addHeader("Content-type", "application/x-www-form-urlencoded");
JSONObject json = new JSONObject();
json.put("username", "xxx");
json.put("password", "xxx");
StringEntity entity = new StringEntity(json.toString());
httppost.setEntity(entity);
HttpResponse post= httpclient.execute(httppost);
if (post.getStatusLine().getStatusCode() == 200) {
String conResult = EntityUtils.toString(post.getEntity());
JSONObject sobj = new JSONObject();
sobj = JSONObject.fromObject(conResult);
System.out.println(sobj);
} else {
System.out.println("失败....");
}
}catch(Exception e){
e.printStackTrace();
}finally{
}
}
java
运行
ok,有以上代码基本可以实现大部分http与https接口的调用了。。。。
附上一个自己项目中实际使用的实例
需求:
代码实现Action:
package cn.thinknet.action;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import cn.thinknet.bean.UserManage;
import cn.thinknet.util.MySSLSocketFactory;
public class UserManageAction extends BaseAction{
private String msg;
private List<UserManage> userManageList;
private JSONArray resultJa;
private String ids;
private JSONObject result;
private UserManage userManage;
public String login(){
HttpClient httpclient = MySSLSocketFactory.getNewHttpClient();
String url ="https://192.168.10.216:443/tnserver/property_manager/login";
try {
List<NameValuePair> list = new ArrayList<NameValuePair>();
list.add(new BasicNameValuePair("username","admin@163.com"));
list.add(new BasicNameValuePair("password","123456"));
HttpPost httppost = new HttpPost(url);
CredentialsProvider credsProvider = new BasicCredentialsProvider();
UsernamePasswordCredentials creds = new UsernamePasswordCredentials("admin", "123");
credsProvider.setCredentials(
new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT),
creds);
((DefaultHttpClient)httpclient).setCredentialsProvider(credsProvider);
httppost.addHeader("Content-type", "application/x-www-form-urlencoded");
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list,"UTF-8");
httppost.setEntity(entity);
HttpResponse post= httpclient.execute(httppost);
if (post.getStatusLine().getStatusCode() == 200) {
String conResult = EntityUtils.toString(post.getEntity());
JSONObject sobj = new JSONObject();
sobj = JSONObject.fromObject(conResult);
System.out.println(sobj);
} else {
System.out.println("失败....");
}
}catch(Exception e){
e.printStackTrace();
}finally{
}
return "success1";
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public JSONArray getResultJa() {
return resultJa;
}
public void setResultJa(JSONArray resultJa) {
this.resultJa = resultJa;
}
public JSONObject getResult() {
return result;
}
public void setResult(JSONObject result) {
this.result = result;
}
public String getIds() {
return ids;
}
public void setIds(String ids) {
this.ids = ids;
}
public UserManage getUserManage() {
return userManage;
}
public void setUserManage(UserManage userManage) {
this.userManage = userManage;
}
public List<UserManage> getUserManageList() {
return userManageList;
}
public void setUserManageList(List<UserManage> userManageList) {
this.userManageList = userManageList;
}
}
java
运行
返回结果:
======
完成!!! 没了,就这么多啦~~~
本人目前也是属于java两年新人,勿喷~~
最后附上简单Dome:
http://download.csdn.net/detail/dcb_ripple/9477041
网址:HttpClient详细实例,Httoclient调用https实例,避免https SSL认证 https://www.yuejiaxmz.com/news/view/1041602
相关内容
EV SSL证书=HTTPS + 安全锁 + 绿色地址栏部署SSL证书后HTTPS仍出现不安全提示怎么办?
修复HTTPS访问问题
https页面与Http页面自动切换
数字签名的应用实例
SSL证书=安全?天威诚信提醒您别错漏了TA!
数字安全守护者:SSL证书与可信数字身份体系双轮驱动
https://kimi.ai
Python requests 移除SSL认证,verify=False,取消控制台输出的InsecureRequestWarning警告
应用全攻略 10个常用数字证书应用实例