Http和Https网络同步请求httpclient和异步请求async-http-client
原文:https://blog.csdn.net/fengshizty/article/details/53100694
Http和https网络请求
主要总结一下使用到的网络请求框架,一种是同步网络请求org.apache.httpcomponents的httpclient,另一种是异步网络请求com.ning的async-http-client,总结一下常用的http请求方式封装使用,如post、get、put、delete等,以及涉及到ssl证书https请求的双向证书验证。
一、apache同步请求httpclient
1、引入文件
- <dependency>
- <groupId>org.apache.httpcomponents</groupId>
- <artifactId>httpclient</artifactId>
- <version>4.5.2</version>
- </dependency>
2、http和https的方法封装
涉及常用的post和get的请求,https的ssl双向证书验证。
- import java.io.IOException;
- import java.io.UnsupportedEncodingException;
- import java.net.URLEncoder;
- import java.security.KeyStore;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Map;
- import java.util.Map.Entry;
- import javax.net.ssl.SSLContext;
- import org.apache.http.NameValuePair;
- import org.apache.http.client.config.RequestConfig;
- import org.apache.http.client.entity.UrlEncodedFormEntity;
- import org.apache.http.client.methods.CloseableHttpResponse;
- import org.apache.http.client.methods.HttpGet;
- import org.apache.http.client.methods.HttpPost;
- import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
- import org.apache.http.entity.StringEntity;
- import org.apache.http.impl.client.CloseableHttpClient;
- import org.apache.http.impl.client.HttpClients;
- import org.apache.http.message.BasicNameValuePair;
- import org.apache.http.ssl.SSLContexts;
- import org.apache.http.util.EntityUtils;
- import org.springframework.core.io.ClassPathResource;
- import org.springframework.core.io.Resource;
- /**
- * 创建时间:2016年11月9日 下午4:16:32
- *
- * @author andy
- * @version 2.2
- */
- public class HttpUtils {
- private static final String DEFAULT_CHARSET = "UTF-8";
- private static final int CONNECT_TIME_OUT = 5000; //链接超时时间3秒
- private static final RequestConfig REQUEST_CONFIG = RequestConfig.custom().setConnectTimeout(CONNECT_TIME_OUT).build();
- private static SSLContext wx_ssl_context = null; //微信支付ssl证书
- static{
- Resource resource = new ClassPathResource("wx_apiclient_cert.p12");
- try {
- KeyStore keystore = KeyStore.getInstance("PKCS12");
- char[] keyPassword = ConfigUtil.getProperty("wx.mchid").toCharArray(); //证书密码
- keystore.load(resource.getInputStream(), keyPassword);
- wx_ssl_context = SSLContexts.custom().loadKeyMaterial(keystore, keyPassword).build();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * @description 功能描述: get 请求
- * @param url 请求地址
- * @param params 参数
- * @param headers headers参数
- * @return 请求失败返回null
- */
- public static String get(String url, Map<String, String> params, Map<String, String> headers) {
- CloseableHttpClient httpClient = null;
- if (params != null && !params.isEmpty()) {
- StringBuffer param = new StringBuffer();
- boolean flag = true; // 是否开始
- for (Entry<String, String> entry : params.entrySet()) {
- if (flag) {
- param.append("?");
- flag = false;
- } else {
- param.append("&");
- }
- param.append(entry.getKey()).append("=");
- try {
- param.append(URLEncoder.encode(entry.getValue(), DEFAULT_CHARSET));
- } catch (UnsupportedEncodingException e) {
- //编码失败
- }
- }
- url += param.toString();
- }
- String body = null;
- CloseableHttpResponse response = null;
- try {
- httpClient = HttpClients.custom()
- .setDefaultRequestConfig(REQUEST_CONFIG)
- .build();
- HttpGet httpGet = new HttpGet(url);
- response = httpClient.execute(httpGet);
- body = EntityUtils.toString(response.getEntity(), DEFAULT_CHARSET);
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (response != null) {
- try {
- response.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- if (httpClient != null) {
- try {
- httpClient.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- return body;
- }
- /**
- * @description 功能描述: get 请求
- * @param url 请求地址
- * @return 请求失败返回null
- */
- public static String get(String url) {
- return get(url, null);
- }
- /**
- * @description 功能描述: get 请求
- * @param url 请求地址
- * @param params 参数
- * @return 请求失败返回null
- */
- public static String get(String url, Map<String, String> params) {
- return get(url, params, null);
- }
- /**
- * @description 功能描述: post 请求
- * @param url 请求地址
- * @param params 参数
- * @return 请求失败返回null
- */
- public static String post(String url, Map<String, String> params) {
- CloseableHttpClient httpClient = null;
- HttpPost httpPost = new HttpPost(url);
- List<NameValuePair> nameValuePairs = new ArrayList<>();
- if (params != null && !params.isEmpty()) {
- for (Entry<String, String> entry : params.entrySet()) {
- nameValuePairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
- }
- }
- String body = null;
- CloseableHttpResponse response = null;
- try {
- httpClient = HttpClients.custom()
- .setDefaultRequestConfig(REQUEST_CONFIG)
- .build();
- httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, DEFAULT_CHARSET));
- response = httpClient.execute(httpPost);
- body = EntityUtils.toString(response.getEntity(), DEFAULT_CHARSET);
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (response != null) {
- try {
- response.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- if (httpClient != null) {
- try {
- httpClient.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- return body;
- }
- /**
- * @description 功能描述: post 请求
- * @param url 请求地址
- * @param s 参数xml
- * @return 请求失败返回null
- */
- public static String post(String url, String s) {
- CloseableHttpClient httpClient = null;
- HttpPost httpPost = new HttpPost(url);
- String body = null;
- CloseableHttpResponse response = null;
- try {
- httpClient = HttpClients.custom()
- .setDefaultRequestConfig(REQUEST_CONFIG)
- .build();
- httpPost.setEntity(new StringEntity(s, DEFAULT_CHARSET));
- response = httpClient.execute(httpPost);
- body = EntityUtils.toString(response.getEntity(), DEFAULT_CHARSET);
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (response != null) {
- try {
- response.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- if (httpClient != null) {
- try {
- httpClient.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- return body;
- }
- /**
- * @description 功能描述: post https请求,服务器双向证书验证
- * @param url 请求地址
- * @param params 参数
- * @return 请求失败返回null
- */
- public static String posts(String url, Map<String, String> params) {
- CloseableHttpClient httpClient = null;
- HttpPost httpPost = new HttpPost(url);
- List<NameValuePair> nameValuePairs = new ArrayList<>();
- if (params != null && !params.isEmpty()) {
- for (Entry<String, String> entry : params.entrySet()) {
- nameValuePairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
- }
- }
- String body = null;
- CloseableHttpResponse response = null;
- try {
- httpClient = HttpClients.custom()
- .setDefaultRequestConfig(REQUEST_CONFIG)
- .setSSLSocketFactory(getSSLConnectionSocket())
- .build();
- httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, DEFAULT_CHARSET));
- response = httpClient.execute(httpPost);
- body = EntityUtils.toString(response.getEntity(), DEFAULT_CHARSET);
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (response != null) {
- try {
- response.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- if (httpClient != null) {
- try {
- httpClient.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- return body;
- }
- /**
- * @description 功能描述: post https请求,服务器双向证书验证
- * @param url 请求地址
- * @param s 参数xml
- * @return 请求失败返回null
- */
- public static String posts(String url, String s) {
- CloseableHttpClient httpClient = null;
- HttpPost httpPost = new HttpPost(url);
- String body = null;
- CloseableHttpResponse response = null;
- try {
- httpClient = HttpClients.custom()
- .setDefaultRequestConfig(REQUEST_CONFIG)
- .setSSLSocketFactory(getSSLConnectionSocket())
- .build();
- httpPost.setEntity(new StringEntity(s, DEFAULT_CHARSET));
- response = httpClient.execute(httpPost);
- body = EntityUtils.toString(response.getEntity(), DEFAULT_CHARSET);
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (response != null) {
- try {
- response.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- if (httpClient != null) {
- try {
- httpClient.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- return body;
- }
- //获取ssl connection链接
- private static SSLConnectionSocketFactory getSSLConnectionSocket() {
- return new SSLConnectionSocketFactory(wx_ssl_context, new String[] {"TLSv1", "TLSv1.1", "TLSv1.2"}, null,
- SSLConnectionSocketFactory.getDefaultHostnameVerifier());
- }
- }
二、com.ning异步请求async-http-client
1、引入文件
- <dependency>
- <groupId>com.ning</groupId>
- <artifactId>async-http-client</artifactId>
- <version>1.9.40</version>
- </dependency>
2、http和https的方法封装
涉及常用的post和get的请求,https的ssl双向证书验证。
- import java.security.KeyStore;
- import java.security.SecureRandom;
- import java.util.Map;
- import java.util.Set;
- import java.util.concurrent.Future;
- import javax.net.ssl.KeyManagerFactory;
- import javax.net.ssl.SSLContext;
- import org.springframework.core.io.ClassPathResource;
- import org.springframework.core.io.Resource;
- import com.ning.http.client.AsyncHttpClient;
- import com.ning.http.client.AsyncHttpClientConfig;
- import com.ning.http.client.Response;
- /**
- * 创建时间:2016年11月8日 下午5:16:32
- *
- * @author andy
- * @version 2.2
- */
- public class HttpKit {
- private static final String DEFAULT_CHARSET = "UTF-8";
- private static final int CONNECT_TIME_OUT = 5000; //链接超时时间3秒
- private static SSLContext wx_ssl_context = null; //微信支付ssl证书
- static{
- Resource resource = new ClassPathResource("wx_apiclient_cert.p12"); //获取微信证书 或者直接从文件流读取
- char[] keyStorePassword = ConfigUtil.getProperty("wx.mchid").toCharArray(); //证书密码
- try {
- KeyStore keystore = KeyStore.getInstance("PKCS12");
- keystore.load(resource.getInputStream(), keyStorePassword);
- KeyManagerFactory keyManagerFactory = KeyManagerFactory
- .getInstance(KeyManagerFactory.getDefaultAlgorithm());
- keyManagerFactory.init(keystore, keyStorePassword);
- SSLContext wx_ssl_context = SSLContext.getInstance("TLS");
- wx_ssl_context.init(keyManagerFactory.getKeyManagers(), null, new SecureRandom());
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * @description 功能描述: get 请求
- * @param url 请求地址
- * @param params 参数
- * @param headers headers参数
- * @return 请求失败返回null
- */
- public static String get(String url, Map<String, String> params, Map<String, String> headers) {
- AsyncHttpClient http = new AsyncHttpClient(new AsyncHttpClientConfig.Builder()
- .setConnectTimeout(CONNECT_TIME_OUT).build());
- AsyncHttpClient.BoundRequestBuilder builder = http.prepareGet(url);
- builder.setBodyEncoding(DEFAULT_CHARSET);
- if (params != null && !params.isEmpty()) {
- Set<String> keys = params.keySet();
- for (String key : keys) {
- builder.addQueryParam(key, params.get(key));
- }
- }
- if (headers != null && !headers.isEmpty()) {
- Set<String> keys = headers.keySet();
- for (String key : keys) {
- builder.addHeader(key, params.get(key));
- }
- }
- Future<Response> f = builder.execute();
- String body = null;
- try {
- body = f.get().getResponseBody(DEFAULT_CHARSET);
- } catch (Exception e) {
- e.printStackTrace();
- }
- http.close();
- return body;
- }
- /**
- * @description 功能描述: get 请求
- * @param url 请求地址
- * @return 请求失败返回null
- */
- public static String get(String url) {
- return get(url, null);
- }
- /**
- * @description 功能描述: get 请求
- * @param url 请求地址
- * @param params 参数
- * @return 请求失败返回null
- */
- public static String get(String url, Map<String, String> params) {
- return get(url, params, null);
- }
- /**
- * @description 功能描述: post 请求
- * @param url 请求地址
- * @param params 参数
- * @return 请求失败返回null
- */
- public static String post(String url, Map<String, String> params) {
- AsyncHttpClient http = new AsyncHttpClient(new AsyncHttpClientConfig.Builder()
- .setConnectTimeout(CONNECT_TIME_OUT).build());
- AsyncHttpClient.BoundRequestBuilder builder = http.preparePost(url);
- builder.setBodyEncoding(DEFAULT_CHARSET);
- if (params != null && !params.isEmpty()) {
- Set<String> keys = params.keySet();
- for (String key : keys) {
- builder.addQueryParam(key, params.get(key));
- }
- }
- Future<Response> f = builder.execute();
- String body = null;
- try {
- body = f.get().getResponseBody(DEFAULT_CHARSET);
- } catch (Exception e) {
- e.printStackTrace();
- }
- http.close();
- return body;
- }
- /**
- * @description 功能描述: post 请求
- * @param url 请求地址
- * @param s 参数xml
- * @return 请求失败返回null
- */
- public static String post(String url, String s) {
- AsyncHttpClient http = new AsyncHttpClient(new AsyncHttpClientConfig.Builder()
- .setConnectTimeout(CONNECT_TIME_OUT).build());
- AsyncHttpClient.BoundRequestBuilder builder = http.preparePost(url);
- builder.setBodyEncoding(DEFAULT_CHARSET);
- builder.setBody(s);
- Future<Response> f = builder.execute();
- String body = null;
- try {
- body = f.get().getResponseBody(DEFAULT_CHARSET);
- } catch (Exception e) {
- e.printStackTrace();
- }
- http.close();
- return body;
- }
- /**
- * @description 功能描述: post https请求,服务器双向证书验证
- * @param url 请求地址
- * @param params 参数
- * @return 请求失败返回null
- */
- public static String posts(String url, Map<String, String> params){
- AsyncHttpClient http = new AsyncHttpClient(
- new AsyncHttpClientConfig.Builder()
- .setConnectTimeout(CONNECT_TIME_OUT)
- .setSSLContext(wx_ssl_context)
- .build());
- AsyncHttpClient.BoundRequestBuilder bbuilder = http.preparePost(url);
- bbuilder.setBodyEncoding(DEFAULT_CHARSET);
- if (params != null && !params.isEmpty()) {
- Set<String> keys = params.keySet();
- for (String key : keys) {
- bbuilder.addQueryParam(key, params.get(key));
- }
- }
- Future<Response> f = bbuilder.execute();
- String body = null;
- try {
- body = f.get().getResponseBody(DEFAULT_CHARSET);
- } catch (Exception e) {
- e.printStackTrace();
- }
- http.close();
- return body;
- }
- /**
- * @description 功能描述: post https请求,服务器双向证书验证
- * @param url 请求地址
- * @param s 参数xml
- * @return 请求失败返回null
- */
- public static String posts(String url, String s) {
- AsyncHttpClient http = new AsyncHttpClient(
- new AsyncHttpClientConfig.Builder()
- .setConnectTimeout(CONNECT_TIME_OUT)
- .setSSLContext(wx_ssl_context).build());
- AsyncHttpClient.BoundRequestBuilder builder = http.preparePost(url);
- builder.setBodyEncoding(DEFAULT_CHARSET);
- builder.setBody(s);
- Future<Response> f = builder.execute();
- String body = null;
- try {
- body = f.get().getResponseBody(DEFAULT_CHARSET);
- } catch (Exception e) {
- e.printStackTrace();
- }
- http.close();
- return body;
- }
- }
三、测试
相同结果下,对同一网络请求平均测试20次请求性能
对于少量的网络请求来说httpclient和异步的async-http-client相差无几,甚至比异步还要快,但是在大量网络请求来说异步性能可能更高,但是上面需要优化如减少链接创建、设置超时时间、设置重试次数等等。
Http和Https网络同步请求httpclient和异步请求async-http-client的更多相关文章
- java判断请求是否ajax异步请求
java判断请求是否ajax异步请求 解决方法: if (request.getHeader("x-requested-with") != null && re ...
- 普通B/S架构模式同步请求与AJAX异步请求区别(个人理解)
在上次面试的时候有被问到过AJAX同步与异步之间的概念问题,之前没有涉及到异步与同步的知识,所以特意脑补了一下,不是很全面... 同步请求流程:提交请求(POST/GET表单相似的提交操作)---服务 ...
- .Net core webapi使用httpClient发送异步请求遇到TaskCanceledException: A task was canceled
前言:本人最近较多使用.net core的项目,最近在使用httpClient发送请求的时候,遇到服务器处理时间较长时,就老是会报异常:TaskCanceledException: A task wa ...
- .Net WebRequest异步请求与WebClient异步请求
很多情况下一般会使用同步方式发出请求,直到响应后再做后续的逻辑处理等,但有时候后续的逻辑处理不依赖于请求的结果或者是可以挂起等到响应后再处理,又或者是为了解决UI“假死”的现象,这时可以使用异步请求 ...
- 原生js--编码请求主体(异步请求)
1.表单编码请求 需要对每个表单元素进行普通的URL编码,使用“=”把编码后的名字和值分开,并使用“&”分开名值对. 例如:a=b&c=d 表单数据编码的MIME类型:applicat ...
- Android okHttp网络请求之Get/Post请求
前言: 之前项目中一直使用的Xutils开源框架,从xutils 2.1.5版本使用到最近的xutils 3.0,使用起来也是蛮方便的,只不过最近想着完善一下app中使用的开源框架,由于Xutils里 ...
- NSURLConnection同步与异步请求 问题
NSURLConnection目前有两个异步请求方法,异步请求中其中一个是代理.一个同步方法.有前辈已经详细介绍,见:http://blog.csdn.net/xyz_lmn/article/deta ...
- 异步请求之ajax
一.初识ajax 1.下载引入jQuery <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"& ...
- PHP异步请求之fsockopen()方法详解
正常情况下,PHP执行的都是同步请求,代码自上而下依次执行,但有些场景如发送邮件.执行耗时任务等操作时就不适用于同步请求,只能使用异步处理请求. 场景要求: 客户端调用服务器a.php接口,需要执行一 ...
随机推荐
- Deep Learning基础--CNN的反向求导及练习
前言: CNN作为DL中最成功的模型之一,有必要对其更进一步研究它.虽然在前面的博文Stacked CNN简单介绍中有大概介绍过CNN的使用,不过那是有个前提的:CNN中的参数必须已提前学习好.而本文 ...
- linux sftp and unix ftp
sftp 1.功能作用 sftp 是一个交互式文件传输程式.它类似于 ftp, 但它进行加密传输,比FTP有更高的安全性. 2.位置 /usr/bin/sftp 3.格式用法 sftp [-1246C ...
- 动画基础--基于Core Animation(3)
参考:https://zsisme.gitbooks.io/ios-/content/ 前面的文章动画基础--基于Core Animation(1),动画基础--基于Core Animation(2) ...
- Network——物理层-练习题与解答
1. 无线电天线通常在其直径等于无线电波的波长的情况下工作效果最好.合理的天线直径的范围是从1厘米到5米.问所覆盖的频率范围是怎样的? 解答: λf = c , c=3x108 (m/s) 对于λ=1 ...
- Django内置信号
阅读目录(Content) Django中内置的signal 自定义信号 1.定义信号 2.注册信号 3.触发信号 回到顶部(go to top) Django中内置的signal Django中提供 ...
- linux下c获取时间
头文件 #include "sys/time.h" 结构体 struct timezone { int tz_minuteswest; /*格林威治时间往西方的时差*/ int t ...
- Linux下GCC相关知识点
摘要: 总结GCC的具体使用,动态库静态库的相关问题 参考资料: <Linux网络编程> ISBN:9787302207177 p19 1 GCC简介 GCC是Linux下的编译工具集,是 ...
- 小米路由器3-R3 刷固件
1.刷机前的路由器升级准备 1-1.首先进入路由器原声后台:miwifi.com 1-2.在右上角,点击系统升级.在系统版本下边选择手动升级,选择资源包里的:“miwifi_r3_all_55ac7_ ...
- vue2.0使用watch监听对象属性
二话不说直接代码,找了一个百度都没找到.... var head=new Vue({ data:{ checkBoxState:{//监听设置开关勾选状态 notice:true, sound:tru ...
- cookie笔记(二)
小荔枝 增 删 查 改 <form action="javascript:void(0)" method="get" accept-charset=&qu ...