HttpClient

SpringCloud中服务和服务之间的调用全部是使用HttpClient,还有前面使用SolrJ中就封装了HttpClient,在调用SolrTemplate的saveBean方法时就调用HttpClient技术。

当前大部分项目暴漏出来的接口是Http请求,数据格式是JSON格式,但在一些老项目使用的仍然是webService。

HttpClient 提供的主要的功能

(1)实现了所有 HTTP 的方法(GET,POST,PUT,DELETE 等)

(2)支持自动转向

(3)支持 HTTPS 协议

(4)支持代理服务器等

1、关于Http的请求类型(常见)

get、put、post、delete含义与区别

1、GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改、增加数据,不会影响资源的内容,即该请求不会产生副作用。无论进行多少次操作,结果都是一样的。

2、与GET不同的是,PUT请求是向服务器端发送数据的,从而改变信息,该请求就像数据库的update操作一样,用来修改数据的内容,但是不会增加数据的种类等,也就是说无论进行多少次PUT操作,其结果并没有不同。

3、POST请求同PUT请求类似,都是向服务器端发送数据的,但是该请求会改变数据的种类等资源,就像数据库的insert操作一样,会创建新的内容。几乎目前所有的提交操作都是用POST请求的。

4、DELETE请求顾名思义,就是用来删除某一个资源的,该请求就像数据库的delete操作。

就像前面所讲的一样,既然PUT和POST操作都是向服务器端发送数据的,那么两者有什么区别呢。。。POST主要作用在一个集合资源之上的(url),而PUT主要作用在一个具体资源之上的(url/xxx),通俗一下讲就是,如URL可以在客户端确定,那么可使用PUT,否则用POST。

数据请求格式

综上所述,我们可理解为以下:

  1. 1POST   /url     创建  
    2DELETE /url/xxx 删除  
    3PUT     /url/xxx 更新
    4GET     /url/xxx 查看

2、HttpClient的请求类型

实现了所有的Http请求类型,相应的类为

HttpGet、HttpPost、HttpDelete、HttpPut

3、Http的使用流程

3.1 创建sms的war子模块

3.2 导入坐标

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.apache.httpcomponents</groupId>
  4. <artifactId>httpclient</artifactId>
  5. <version>4.5.3</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>com.alibaba</groupId>
  9. <artifactId>fastjson</artifactId>
  10. <version>1.2.28</version>
  11. </dependency>
  12. </dependencies>

3.3 测试demo,原生HttpClient使用

3.3.1 新建HttpClientGetTest.java测试类,测试get请求

  1. public static void main(String[] args) throws IOException {
  2. //1.打开浏览器
  3. CloseableHttpClient httpClient = HttpClients.createDefault();
  4. //2.声明get请求
  5. HttpGet httpGet = new HttpGet("http://www.baidu.com/s?wd=java");
  6. //3.发送请求
  7. CloseableHttpResponse response = httpClient.execute(httpGet);
  8. //4.判断状态码
  9. if(response.getStatusLine().getStatusCode()==200){
  10. HttpEntity entity = response.getEntity();
  11. //使用工具类EntityUtils,从响应中取出实体表示的内容并转换成字符串
  12. String string = EntityUtils.toString(entity, "utf-8");
  13. System.out.println(string);
  14. }
  15. //5.关闭资源
  16. response.close();
  17. httpClient.close();
  18. }

3.3.2 新建HttpClientPostTest.java测试类,测试post请求

  1. public static void main(String[] args) throws IOException {
  2. //1.打开浏览器
  3. CloseableHttpClient httpClient = HttpClients.createDefault();
  4. //2.声明get请求
  5. HttpPost httpPost = new HttpPost("https://www.oschina.net/");
  6. //3.开源中国为了安全,防止恶意攻击,在post请求中都限制了浏览器才能访问
  7. httpPost.addHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36");
  8. //4.判断状态码
  9. List<NameValuePair> parameters = new ArrayList<NameValuePair>(0);
  10. parameters.add(new BasicNameValuePair("scope", "project"));
  11. parameters.add(new BasicNameValuePair("q", "java"));
  12.  
  13. UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters,"UTF-8");
  14.  
  15. httpPost.setEntity(formEntity);
  16.  
  17. //5.发送请求
  18. CloseableHttpResponse response = httpClient.execute(httpPost);
  19.  
  20. if(response.getStatusLine().getStatusCode()==200){
  21. HttpEntity entity = response.getEntity();
  22. String string = EntityUtils.toString(entity, "utf-8");
  23. System.out.println(string);
  24. }
  25. //6.关闭资源
  26. response.close();
  27. httpClient.close();
  28. }

3.3.3 测试获取运营商品牌数据代码实现

自定义工具类HttpClientUtil如果能直接访问,简单的访问实现。

  1. //设置请求地址
  2. HttpClientUtil util=new HttpClientUtil("http://localhost:9101/brand/findAll.do");
  3. //设置请求方式
  4. util.get();
  5. //获取返回内容
  6. String content=util.getContent();
  7. //打印结果
  8. System.out.println("content");

使用HttpClientUtil实现先登录在访问页面

要点:务必保证登录和查询请求是连续的请求。借助的自定义工具类HttpClientUtil

  1. public class HttpClientTest {
  2. public static void main(String[] args) {
  3. //设置用户名和密码
  4. Map<String, String> map = new HashMap<String,String>();
  5. map.put("username", "admin");
  6. map.put("password", "123456");
  7.  
  8. //需要先通过springSecurity认证
  9. String s1 = HttpClientUtil.doPost("http://localhost:9101/login", map);
  10.  
  11. Map<String, String> brand = new HashMap<String,String>();
  12. brand.put("name", "123456");
  13. brand.put("firstChar", "T");
  14.  
  15. String jsonMap = JSON.toJSONString(brand);
  16. System.out.println(jsonMap);
  17. String s2 = HttpClientUtil.doPostJson("http://localhost:9101/brand/add.do", jsonMap);
  18.  
  19. //String s2 = HttpClientUtil.doGet("http://localhost:9101/brand/findAll.do");
  20. System.out.println(s2);
  21. }
  22. }

自定义工具类源码HttpClientUtil。注意导入的依赖

  1. import java.io.IOException;
  2. import java.security.GeneralSecurityException;
  3. import java.security.cert.CertificateException;
  4. import java.security.cert.X509Certificate;
  5. import java.text.ParseException;
  6. import java.util.HashMap;
  7. import java.util.LinkedList;
  8. import java.util.List;
  9. import java.util.Map;
  10.  
  11. import javax.net.ssl.SSLContext;
  12. import javax.net.ssl.SSLException;
  13. import javax.net.ssl.SSLSession;
  14. import javax.net.ssl.SSLSocket;
  15. import javax.net.ssl.TrustManager;
  16. import javax.net.ssl.X509TrustManager;
  17.  
  18. import org.apache.http.Consts;
  19. import org.apache.http.HttpEntity;
  20. import org.apache.http.NameValuePair;
  21. import org.apache.http.client.ClientProtocolException;
  22. import org.apache.http.client.config.RequestConfig;
  23. import org.apache.http.client.entity.UrlEncodedFormEntity;
  24. import org.apache.http.client.methods.CloseableHttpResponse;
  25. import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
  26. import org.apache.http.client.methods.HttpGet;
  27. import org.apache.http.client.methods.HttpPost;
  28. import org.apache.http.client.methods.HttpPut;
  29. import org.apache.http.client.methods.HttpUriRequest;
  30. import org.apache.http.client.protocol.HttpClientContext;
  31. import org.apache.http.conn.scheme.Scheme;
  32. import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
  33. import org.apache.http.conn.ssl.SSLContextBuilder;
  34. import org.apache.http.conn.ssl.SSLSocketFactory;
  35. import org.apache.http.conn.ssl.TrustStrategy;
  36. import org.apache.http.conn.ssl.X509HostnameVerifier;
  37. import org.apache.http.entity.StringEntity;
  38. import org.apache.http.impl.client.CloseableHttpClient;
  39. import org.apache.http.impl.client.DefaultHttpClient;
  40. import org.apache.http.impl.client.HttpClients;
  41. import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
  42. import org.apache.http.message.BasicNameValuePair;
  43. import org.apache.http.util.EntityUtils;
  44.  
  45. /**
  46. * http请求客户端
  47. *
  48. * @author Administrator
  49. *
  50. */
  51. public class HttpClientUtil {
  52.  
  53. public static HttpClientContext context = null;
  54.  
  55. static {
  56. System.out.println("====================begin");
  57. context = HttpClientContext.create();
  58. }
  59.  
  60. private String url;
  61. private Map<String, String> param;
  62. private int statusCode;
  63. private String content;
  64. private String xmlParam;
  65. private boolean isHttps;
  66.  
  67. public boolean isHttps() {
  68. return isHttps;
  69. }
  70.  
  71. public void setHttps(boolean isHttps) {
  72. this.isHttps = isHttps;
  73. }
  74.  
  75. public String getXmlParam() {
  76. return xmlParam;
  77. }
  78.  
  79. public void setXmlParam(String xmlParam) {
  80. this.xmlParam = xmlParam;
  81. }
  82.  
  83. public HttpClientUtil(String url, Map<String, String> param) {
  84. this.url = url;
  85. this.param = param;
  86. }
  87.  
  88. public HttpClientUtil(String url) {
  89. this.url = url;
  90. }
  91.  
  92. public void setParameter(Map<String, String> map) {
  93. param = map;
  94. }
  95.  
  96. public void addParameter(String key, String value) {
  97. if (param == null)
  98. param = new HashMap<String, String>();
  99. param.put(key, value);
  100. }
  101.  
  102. public void post() throws ClientProtocolException, IOException {
  103. HttpPost http = new HttpPost(url);
  104. setEntity(http);
  105. execute(http);
  106. }
  107.  
  108. public void put() throws ClientProtocolException, IOException {
  109. HttpPut http = new HttpPut(url);
  110. setEntity(http);
  111. execute(http);
  112. }
  113.  
  114. public void get() throws ClientProtocolException, IOException {
  115. if (param != null) {
  116. StringBuilder url = new StringBuilder(this.url);
  117. boolean isFirst = true;
  118. for (String key : param.keySet()) {
  119. if (isFirst)
  120. url.append("?");
  121. else
  122. url.append("&");
  123. url.append(key).append("=").append(param.get(key));
  124. }
  125. this.url = url.toString();
  126. }
  127. HttpGet http = new HttpGet(url);
  128. execute(http);
  129. }
  130.  
  131. /**
  132. * set http post,put param
  133. */
  134. private void setEntity(HttpEntityEnclosingRequestBase http) {
  135. if (param != null) {
  136. List<NameValuePair> nvps = new LinkedList<NameValuePair>();
  137. for (String key : param.keySet())
  138. nvps.add(new BasicNameValuePair(key, param.get(key))); // 参数
  139. http.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8)); // 设置参数
  140. }
  141. if (xmlParam != null) {
  142. http.setEntity(new StringEntity(xmlParam, Consts.UTF_8));
  143. }
  144. }
  145.  
  146. private void execute(HttpUriRequest http) throws ClientProtocolException,
  147. IOException {
  148. CloseableHttpClient httpClient = null;
  149. try {
  150. if (isHttps) {
  151. SSLContext sslContext = new SSLContextBuilder()
  152. .loadTrustMaterial(null, new TrustStrategy() {
  153. // 信任所有
  154. public boolean isTrusted(X509Certificate[] chain,
  155. String authType)
  156. throws CertificateException {
  157. return true;
  158. }
  159. }).build();
  160. SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
  161. sslContext);
  162. httpClient = HttpClients.custom().setSSLSocketFactory(sslsf)
  163. .build();
  164. } else {
  165. httpClient = HttpClients.createDefault();
  166. }
  167. CloseableHttpResponse response = httpClient.execute(http,context);
  168. try {
  169. if (response != null) {
  170. if (response.getStatusLine() != null)
  171. statusCode = response.getStatusLine().getStatusCode();
  172. HttpEntity entity = response.getEntity();
  173. // 响应内容
  174. content = EntityUtils.toString(entity, Consts.UTF_8);
  175. }
  176. } finally {
  177. response.close();
  178. }
  179. } catch (Exception e) {
  180. e.printStackTrace();
  181. } finally {
  182. httpClient.close();
  183. }
  184. }
  185.  
  186. public int getStatusCode() {
  187. return statusCode;
  188. }
  189.  
  190. public String getContent() throws ParseException, IOException {
  191. return content;
  192. }
  193. }

HttpClient介绍和简单使用流程的更多相关文章

  1. HttpClient介绍和使用

    HttpClient介绍和使用 今天有一个需求:后台访问一个接口,获取返回的数据.于是找到了HttpClient 1.介绍 SpringCloud中服务和服务之间的调用全部是使用HttpClient, ...

  2. 微信公众号PHP简单开发流程

    原文:微信公众号PHP简单开发流程 微信公众号开发分傻瓜模式和开发者模式两种,前者不要考虑调用某些接口,只要根据后台提示傻瓜式操作即可,适用于非专业开发人员. 开发模式当然就是懂程序开发的人员使用的. ...

  3. WebRTC介绍及简单应用

    WebRTC介绍及简单应用 WebRTC,即Web Real-Time Communication,web实时通信技术.简单地说就是在web浏览器里面引入实时通信,包括音视频通话等. WebRTC实时 ...

  4. 基于modelsim-SE的简单仿真流程—下

    基于modelsim-SE的简单仿真流程—下 编译 在 WorkSpace 窗口的 counter_tst.v上点击右键,如果选择Compile selected 则编译选中的文件,Compile A ...

  5. 基于modelsim-SE的简单仿真流程—上

    基于modelsim-SE的简单仿真流程 编写RTL功能代码 要进行功能仿真,首先得用需要仿真的模块,也就是RTL功能代码,简称待测试的模块,该模块也就是在设计下载到FPGA的电路.一个电路模块想要有 ...

  6. 【转载】Ssh整合开发介绍和简单的登入案例实现

    Ssh整合开发介绍和简单的登入案例实现 Ssh整合开发介绍和简单的登入案例实现 一  介绍: Ssh是strtus2-2.3.1.2+ spring-2.5.6+hibernate-3.6.8整合的开 ...

  7. python模块介绍- HTMLParser 简单的HTML和XHTML解析器

    python模块介绍- HTMLParser 简单的HTML和XHTML解析器 2013-09-11 磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq ...

  8. Java变量&&简单程序流程&&循环

    变量:强类型局部变量: 1.先赋值,后使用 2.作用范围:从定义开始,到所在代码块结束 3.重合范围内不允许重复命名 数据类型(8中基本类型) byte 1B -128~127 short 2B -3 ...

  9. 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)

    一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...

随机推荐

  1. test aria2 on windows platform

    import 'dart:io'; import 'dart:convert'; import 'package:path/path.dart'; import 'package:web_socket ...

  2. Matlab装饰模式

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.根据https://www.runoob.com/design-pattern/decorator ...

  3. LocalStorageUtils

    对localStorage进行封装: var LocalStorageUtils = new function (){ if(window.localStorage==null){ throw new ...

  4. Java 之 Maven 常用命令

    一.Maven 常用命令 在 cmd 中可以通过一系列的 maven 命令对我们的 maven 工程进行编译.测试.运行.打包.安装和部署. 1.compile 命令 compile 是 maven ...

  5. 【Flask】 python学习第一章 - 5.0 模板

    jinjia2 模板 python实现 flask 内置语言  参照Djago实现  设置模板文件夹 设置模板语言 jinja2 demo6_template.html  ----> 从代码渲染 ...

  6. sklearn.feature_extraction.text 的TfidfVectorizer函数

    TfidfVectorizer函数主要用于,将文档(句子)等通过 tf-idf值来进行表示,也就是用一个tf-idf值的矩阵来表示文档(句子也可). from sklearn.feature_extr ...

  7. Python的csv文件(csv模块)和ini文件(configparser模块)处理

    Python的csv文本文件(csv模块)和ini文本文件(configparser模块)处理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.csv文件 1>.CSV文件 ...

  8. NGINX并发量优化

    NGINX并发量优化 一.压力测试 命令:ab -c 2000 -n 2000 web服务器的地址 ab:压力测试工具 -c:client缩写,客户端的数量 -n:总的访问量,所有客户端总共的访问量. ...

  9. 下载恶意pcap包的网站

    说几个我经常用的,免费的:1.  Malware  Traffic  Analysis:  http://www.malware-traffic-analysis.net/2018/index.htm ...

  10. js插件---videojs的使用

    js插件---videojs的使用 一.总结 一句话总结: 网上有各种细致的现成的代码可以拿来用,没必要自己死专 1.video.js有两种初始化方式? 一种是在video的html标签之中 一种是使 ...