这里有新鲜出炉的 Java 设计模式, 程序狗速度看过来!
Java 程序设计语言
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言, 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台 (即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se)) 的总称
下面小编就为大家带来一篇 JAVA 利用 HttpClient 进行 POST 请求 (HTTPS) 实例小编觉得挺不错的, 现在就分享给大家, 也给大家做个参考一起 小编过来看看吧
最近, 需要对客户的接口做一个包装, 然后供自己公司别的系统调用, 客户接口是用 HTTP URL 实现的, 我想用 HttpClient 包进行请求, 同时由于请求的 URL 是 HTTPS 的, 为了避免需要证书, 所以用一个类继承 DefaultHttpClient 类, 忽略校验过程
1. 写一个 SSLClient 类, 继承至 HttpClient
- package com.pcmall.service.sale.miaomore.impl;
- 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.conn.ClientConnectionManager;
- 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;
- // 用于进行 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));
- }
- }
2. 写一个利用 HttpClient 发送 post 请求的类
- package com.pcmall.service.sale.miaomore.impl;
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Map;
- import java.util.Map.Entry;
- import org.apache.http.HttpEntity;
- import org.apache.http.HttpResponse;
- import org.apache.http.NameValuePair;
- import org.apache.http.client.HttpClient;
- import org.apache.http.client.entity.UrlEncodedFormEntity;
- import org.apache.http.client.methods.HttpPost;
- import org.apache.http.message.BasicNameValuePair;
- import org.apache.http.util.EntityUtils;
- /*
- * 利用 HttpClient 进行 post 请求的工具类
- */
- public class HttpClientUtil {
- public String doPost(String url, Map < String, String > map, String charset) {
- HttpClient httpClient = null;
- HttpPost httpPost = null;
- String result = null;
- try {
- httpClient = new SSLClient();
- httpPost = new HttpPost(url);
- // 设置参数
- List < NameValuePair > list = new ArrayList < NameValuePair > ();
- Iterator iterator = map.entrySet().iterator();
- while (iterator.hasNext()) {
- Entry < String,
- String > elem = (Entry < String, String > ) iterator.next();
- list.add(new BasicNameValuePair(elem.getKey(), elem.getValue()));
- }
- if (list.size() > 0) {
- UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, charset);
- httpPost.setEntity(entity);
- }
- HttpResponse response = httpClient.execute(httpPost);
- if (response != null) {
- HttpEntity resEntity = response.getEntity();
- if (resEntity != null) {
- result = EntityUtils.toString(resEntity, charset);
- }
- }
- } catch(Exception ex) {
- ex.printStackTrace();
- }
- return result;
- }
- }
3. 调用 post 请求的测试代码
- package com.pcmall.service.sale.miaomore.impl;
- import java.util.HashMap;
- import java.util.Map;
- // 对接口进行测试
- public class TestMain {
- private String url = "https://xxx.xxx.xxx/";
- private String charset = "utf-8";
- private HttpClientUtil httpClientUtil = null;
- public TestMain() {
- httpClientUtil = new HttpClientUtil();
- }
- public void test() {
- String httpOrgCreateTest = url + "xxx/xxx/delivery";
- Map < String,
- String > createMap = new HashMap < String,
- String > ();
- createMap.put("delivery_code", "1D1QZ222Z22SM21A");
- createMap.put("timestamp", "1479198840000");
- createMap.put("sign", "F2109C333F3EADE929F932E89703FA0F683D43EB");
- String httpOrgCreateTestRtn = httpClientUtil.doPost(httpOrgCreateTest, createMap, charset);
- System.out.println("result:" + httpOrgCreateTestRtn);
- }
- public static void main(String[] args) {
- TestMain main = new TestMain();
- main.test();
- }
- }
刚开始不是很明白 BasicNameValuePair 的用法, 后来慢慢摸索了一下, 发现 BasicNameValuePair 是存储键值对的类, 当添加新的 key 和 value 值, 它会自动给装换成 http 的格式,= 和 & 符号, 比如 https://xxx.xxx.xxx/xxx/xxxx/delivery?delivery_code=DQZZSM2A×tamp=1479198840000&sign=F209C33FEADE99F93E8970FA0F68D3EB, 我们都不用自己进行拼接和匹配了, 个人觉得它用起来还是挺方便而且准确度也高, 希望可以帮助到大家!
来源: http://www.phperz.com/article/18/0211/359333.html