HttpClient介绍和使用

今天有一个需求:后台访问一个接口,获取返回的数据。于是找到了HttpClient

1.介绍

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

笔者在查找HttpClient的使用方法的时候,发现很多文章都使用了这句话,在这里引用一下。

HttpClient提供的主要功能:

  • 实现了所有的Http方法(Get,Post,Put,Delete)
  • 支持自动转向(自动重定向)
  • 支持HTTPS协议
  • 支持代码服务器等

2.使用流程

  1. 创建一个HttpClient对象
  2. 创建请求方法的实例对象,并且传入需要请求的URL
  3. 设置请求头,请求体等内容
  4. 通过HttpClient执行请求方法
  5. 获取响应结果。获取响应的响应头,响应码,响应体
  6. 关闭HttpClient,和响应结果

3.代码实现

笔者对HttpClent进行了简单封装

3.1导入坐标

<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>

3.2Get方式请求

	//HttpClient客户端
private static CloseableHttpClient httpClient ;
//响应
private static CloseableHttpResponse httpResponse ; /**
* 返回Get方式请求得实体
* @param url 需要通过Get方式请求的URL
* @param headers 需要添加的请求头
* @return 返回响应的实体
*/
public static HttpReturn doGet(String url, Header[] headers) throws IOException {
//创建一个httpClient对象,相当于创建了一个浏览器,用来访问URL链接
httpClient = HttpClients.createDefault();
//创建Get请求
HttpGet httpGet = new HttpGet(url);
//设置请求头
httpGet.setHeaders(headers);
//访问这个Get链接
httpResponse = httpClient.execute(httpGet);
//获取响应的状态码
int statusCode = httpResponse.getStatusLine().getStatusCode();
//获取响应头
Header[] allHeaders = httpResponse.getAllHeaders();
//获取响应体,并进行封装
HttpEntity entity = httpResponse.getEntity();
//将响应的实体按照utf-8转换程字符串
String s = EntityUtils.toString(entity, "utf-8");
//创建自定义Http请求返回结果
HttpReturn httpReturn = new HttpReturn(statusCode,s,allHeaders);
//关闭使用的流
HttpClientResult.destoryResourcec();
return httpReturn ;
}

代码解读:这是一个笔者自定义的工具类,传入需要访问的url和需要添加的请求头。HttpReturn是笔者自定义的实体,用来存放返回的信息。

public class HttpReturn {
//Http请求状态码
private int httpStatusCode ;
//Http请求返回的实体
private String httpEntity ;
//Http请求头
private Header[] headers ;

destoryResourcec是笔者自定义的一个关闭流的静态方法

public static void destoryResourcec(){
if(httpResponse != null){
try {
httpResponse.close();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(httpClient != null){
try {
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

其他的代码的解释注释中已经全部注明。

3.3Post方式请求

/**
* Post方式请求的方式
* @param url 需要进行请求的URL
* @param headers 需要添加的请求头
* @param entity 需要携带的请求体
* @return 返回响应的实体
*/
public static HttpReturn doPost(String url , Header[] headers , HttpEntity entity) throws IOException {
//创建一个httpClient对象,相当于创建了一个浏览器,用来访问URL链接
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
//设置请求头
httpPost.setHeaders(headers);
//添加请求体
httpPost.setEntity(entity);
CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
//将状态码,实体,头信息放在了一起
HttpReturn httpReturn = new HttpReturn(httpResponse.getStatusLine().getStatusCode(),EntityUtils.toString(httpResponse.getEntity(),"utf-8"),httpResponse.getAllHeaders()) ;
HttpClientResult.destoryResourcec();
return httpReturn ;
}

相对于Get方式,Post方式多了一个实体

这是HttpEntity的接口的部分实现类,对应了各种实体的创建方式,笔者使用了UrlEncodedFormEntity相当于x-www-form-urlencoded的表单提交方式

下面看一下添加实体的代码

//封装URL
String url = "*****************************";
// 设置请求头消息User-Agent
Header[] headers = new Header[2];
//设置表单的提交方式
headers[0] = new BasicHeader("Content-Type","application/x-www-form-urlencoded") ;
//设置为为浏览器访问方式,现在有一些网站不允许非浏览器访问
headers[1] = new BasicHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0");
//创建实体键值对的集合
List<NameValuePair> parameters = new ArrayList<NameValuePair>(0);
//创建最基本的键值
NameValuePair nameValuePair = new BasicNameValuePair("fjmc",roomNum);
parameters.add(nameValuePair);
try {
//将声名的实体写入
HttpEntity httpEntity = new UrlEncodedFormEntity(parameters);
HttpReturn httpReturn = HttpClientResult.doPost(url, headers, httpEntity);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.rintStackTrace();
}

上面代码中的List<NameValuePair>就是用来存放表单信息的键值的

NameValuePair是一个键值的接口,使用其实现类BasicNameValuePair,通过其构造方法,将键值传入

public class BasicNameValuePair implements NameValuePair, Cloneable, Serializable {
private static final long serialVersionUID = -6437800749411518984L;
private final String name;
private final String value;

然后将这个对象添加到List集合中,再将实体放入UrlEncodedFormEntity中即可,此时一个HttpEntity构造完成。

3.4Put方式请求

Put方式的请求和Post方式 相同,只是请求方式变化,仍然使用body添加数据

3.5Delete方式请求

Delete方式和Get方式相同

最后推荐一个解析html的工具, jsoup

坐标

<dependency>
<!-- jsoup HTML parser library @ https://jsoup.org/ -->
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.12.1</version>
</dependency>

中文版网站https://www.open-open.com/jsoup/dom-navigation.htm有兴趣可以了解一下

HttpClient介绍和使用的更多相关文章

  1. 接口测试——httpclient介绍与请求方式详解

    httpClient工具介绍 HTTP协议可能是现在lntemet上使用得最多.最重要的协议了,越来越多的Java应用程序需要直接通过HTTP协议来访问网络资源.虽然在JDK的java.net包中已经 ...

  2. httpclient介绍与请求方式详解

    httpClient工具介绍 HTTP协议可能是现在lntemet上使用得最多.最重要的协议了,越来越多的Java应用程序需要直接通过HTTP协议来访问网络资源.虽然在JDK的java.net包中已经 ...

  3. httpclient介绍

    前言 超文本传输协议(HTTP)也许是当今互联网上使用的最重要的协议了.Web服务,有网络功能的设备和网络计算的发展,都持续扩展了HTTP协议的角色,超越了用户使用的Web浏览器范畴,同时,也增加了需 ...

  4. httpclient介绍与使用

    什么是httpclient HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HT ...

  5. HttpClient介绍和简单使用流程

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

  6. 【JAVA】通过HttpClient发送HTTP请求的方法

    HttpClient介绍 HttpClient 不是一个浏览器.它是一个客户端的 HTTP 通信实现库.HttpClient的目标是发 送和接收HTTP 报文.HttpClient不会去缓存内容,执行 ...

  7. 理解并使用.NET 4.5中的HttpClient

    HttpClient介绍 HttpClient是.NET4.5引入的一个HTTP客户端库,其命名空间为System.Net.Http..NET 4.5之前我们可能使用WebClient和HttpWeb ...

  8. Android入门:用HttpClient模拟HTTP的GET和POST请求

    一.HttpClient介绍   HttpClient是用来模拟HTTP请求的,其实实质就是把HTTP请求模拟后发给Web服务器:   Android已经集成了HttpClient,因此可以直接使用: ...

  9. HttpClient中异步方法的同步调用

    在System.Net.Http中,提供了使用Http与远程服务器通讯的httpClient,但是里面都是异步方法,有时候我们并不需要使用异步操作.这个时候可以使用如下的方式来进行同步调用. clas ...

随机推荐

  1. Python1_Python的目录结构、执行顺序、__name__ == __main__

    Python执行顺序 python属于脚本语言,不像编译型的语言那样先将程序编译成二进制后再运行,而是动态地逐行解释运行: 也就是从脚本的第一行开始运行,没有统一的入口. python会从文件的第一行 ...

  2. CString::CompareNoCase与CString::Compare的区别

    转载:https://blog.csdn.net/lingdxuyan/article/details/4362116 函数原型:int CompareNoCase( LPCTSTR lpsz ) c ...

  3. Java面试思路

    一.javaSE基础 1.java IO流 2.java NIO 3.java集合 4.java注解 5.java泛型 6.java反射 7.java多线程 8.常用String.数组.日期操作 二. ...

  4. 远程管理服务器--批量管理服务器,vps

    一般大型的企事业单位都有自己的服务器,但是服务器一般都放在机房,辐射较大,噪音大,如何能有效的避免这一情况呢?哈哈,那就来个远程桌面,远程操作服务器吧. 一.使用 iis7远程连接管理工具工具下载官网 ...

  5. Django简介、安装和入门

    python三大主流Web框架 Django 优点:大而全,自身携带的组件和功能特别特别多,类似于航空母舰 缺点:过于笨重,所需功能不多时,Django依然提供这些功能,占据内存 Flask 优点:小 ...

  6. 基于GPS北斗卫星授时系统和NTP网络授时服务器的设计与开发

    基于GPS北斗卫星授时系统和NTP网络授时服务器的设计与开发 安徽京准科技提供@请勿转载@@ 更多资料请参考——ahjzsz.com 天文观测设备对于控制系统的时间准确度有严格要求.为此,采用搭建高精 ...

  7. 31.用python中的serial向串口发送和接收数据(案例一)

    代码功能说明:1.向串口助手发送十六进制数据:0X01,0X03,0X00,0X00,0X00,0X01,0X84,0X0A: 2.用串口助手向代码发送数据,并将发送过来的数据保存在数据库中,按数据和 ...

  8. 9.python中sys.argv[]用法说明

    在python中sys.argv[]是用来获取命令行输入的参数的(参数和参数之间空格区分),sys.argv[0]表示代码本身文件路径,所以从参数1开始,表示获取的参数了 举例说明:创建一个程序名为t ...

  9. Java工作流引擎节点接收人设置“按自定义SQL计算”系列讲解

    关键字: 驰骋工作流程快速开发平台 工作流程管理系统 工作流引擎 asp.net工作流引擎 java工作流引擎. 开发者表单  拖拽式表单 工作流系统CCBPM节点访问规则接收人规则 适配数据库: o ...

  10. pdf文件内容查看器 -- 采用wpf开发

    前言 pdf是一种应用非常广的版式文档格式,已成为事实上的国际标准.关于pdf格式的文章汗牛充栋,本文也是关于pdf格式的文章,但是本文不是纸上谈兵:本人这几周一直研究pdf格式内容,不但对pfd格式 ...