分享知识-快乐自己:HttpClient 访问 WebService 开放接口
HttpClient:
场景需求如下:
1、项目中需要与一个基于HTTP协议的第三方的接口进行对接
2、项目中需要动态的调用WebService服务(不生成本地源码)
3、项目中需要利用其它网站的相关数据
这些需求可能或多或少的会发生在平时的开发中,针对每种情况,可能解决方案不止一种。本文使用HttpClient这种工具来讲解HttpClient的相关知识,以及如何使用HttpClient完成上述需求。
HttpClient 不是浏览器?
有人说,HttpClient不就是一个浏览器嘛。。。
可能不少人对HttpClient会产生这种误解,他们的观点是这样的:既然HttpClient是一个HTTP客户端编程工具,那不就相当于是一个浏览器了吗?无非它不能把HTML渲染出页面而已罢了。
其实HttpClient不是浏览器,它是一个HTTP通信库,因此它只提供一个通用浏览器应用程序所期望的功能子集,最根本的区别是HttpClient中没有用户界面,浏览器需要一个渲染引擎来显示页面,并解释用户输入
HttpClient 是什么?
HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。
虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。
HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
为什么要用HttpClient,它跟同类产品有什么区别呢?
1):提到HttpClient,就不得不提jdk原生的URL了。
jdk中自带了基本的网络编程,也就是java.net包下的一系列API。通过这些API,也可以完成网络编程和访问。
此外,另一个开源项目jsoup,它是一个简单的HTML解析器,可以直接解析指定URL请求地址的内容,它可以通过DOM方式来取数据,也是比较方便的API。
那既然已经有这些工具了,为什么还是有好多好多使用HttpClient的呢?
这里其实是有一个错误的认识:Jsoup是解析器不假,但它跟HttpClient不是同类产品(类似Hibernate和MyBatis),实际上日常使用通常会用HttpClient配合Jsoup做网页爬虫。
HttpClient还是有很多好的特点(摘自Apache HttpClient官网):
1、基于标准、纯净的java语言。实现了HTTP1.0和HTTP1.1;
2、以可扩展的面向对象的结构实现了HTTP全部的方法(GET, POST等7种方法);
3、支持HTTPS协议;
4、通过HTTP代理建立透明的连接;
5、利用CONNECT方法通过HTTP代理建立隧道的HTTPS连接;
6、Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos认证方案;
7、插件式的自定义认证方案;
8、便携可靠的套接字工厂使它更容易的使用第三方解决方案;
9、连接管理器支持多线程应用;支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接;
10、自动处理Set-Cookie中的Cookie;
11、插件式的自定义Cookie策略;
12、Request的输出流可以避免流中内容直接缓冲到socket服务器;
13、Response的输入流可以有效的从socket服务器直接读取相应内容;
14、在HTTP1.0和HTTP1.1中利用KeepAlive保持持久连接;
15、直接获取服务器发送的response code和 headers;
16、设置连接超时的能力;
17、实验性的支持HTTP1.1 response caching;
18、源代码基于Apache License 可免费获取。
HttpClient 能干嘛?
在后端开发过程中,后端服务不一定部署在一台服务器上,所以我们需要一种技术可以实现后端调用其他后端的服务,这种调用被称为RPC(远程过程调用),如下图所示:

HttpClient编写程序流程总结:
POM:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
流程:
1、创建HttpClient对象
这儿使用的是org.apache.http.impl.client.CloseableHttpClient,他是HttpClient接口的一个实例,创建该对象的最简单方法:CloseableHttpClient client = HttpClients.createDefault();
HttpClients是创建CloseableHttpClient的工厂,采用默认的配置来创建实例,一般情况下我们就用这个默认的实例就足够,后面我们可以去看下怎么定制自己需求配置的来创建HttpClient接口的实例。如果你去看这个函数的源代码,你可以看到
org.apache.http.client.CookieStore,org.apache.http.client.config.RequestConfig等等都是采用默认的。
2、创建某种请求方法的实例
创建某种请求的实例,并指定请求的url,如果是get请求,创建对象HttpGet,如果是post 请求,创建对象HttpPost。
类型的还有 HttpHead, HttpPost, HttpPut, HttpDelete, HttpTrace, 还有 HttpOptions。分别对应HEAD、POST PUT、DELETE、TRACE、OPTIONS方法,每个方法是做什么的如下表:

可以看得到在Http协议中,只有post方法和put方法的请求里面有实体
3、如果有请求参数的话,Get方法直接写在url后面,例如

或者使用setParameter来设置参数:
使用 URIBuilder 对路径请求信息进行封装。
http://www.google.com/search?q=httpclient&btnG=Google+Search&aq=f&oq=

POST 请求也可以使用 此方式进行携带参数。(携带参数有多种)
在介绍另外几种:


3):发送请求
调用CloseableHttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个CloseableHttpResponse对象。
CloseableHttpResponse response = client.execute(httpPost);
很明显CloseableHttpResponse就是用了处理返回数据的实体,通过它我们可以拿到返回的状态码、首部、实体等等我们需要的东西。
4):获取请求结果
调用CloseableHttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;
调用CloseableHttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容

通过CloseableHttpEntity的getEntity取得实体之后,有两种处理结果的方法,
方法一:使用EntityUtils来处理。
该类是官方提供的一个处理实体的工具类,toSting方法将返回的实体转换为字符串,
但是官网不建议使用这个,除非响应实体从一个可信HTTP服务器发起和已知是有限长度的。
方法二:使用InputStream来读取
因为httpEntity.getContent方法返回的就是InputStream类型。
这种方法是官网推荐的方式,需要记得的是要自己释放底层资源。
关闭连接释放资源:

Demo 源码下载:
分享知识-快乐自己:HttpClient 访问 WebService 开放接口的更多相关文章
- 使用httpclient访问NLP应用接口例子
参考网址: http://yuzhinlp.com/docs.html 接入前须知 接入条件 1.进入网站首页,点击注册成为语知科技用户 2.注册完成后,系统将提供语知科技用户唯一标识APIKey,并 ...
- 十九、.net core使用SoapCore开发webservice接口,以及使用HttpClientFactory动态访问webservice接口
使用SoapCore实现在.net core平台下开发webservice:以及使用HttpClientFactory动态访问webservice. 首先,需要在包项目下面引用SoapCore: 然后 ...
- WebService---Android中访问WebService接口的方法
最近公司有个项目需要从Android平台访问WebService接口,实现向发布的函数传递对象.在网上找了一些资料,发现使用ksoap2可以调用WebService传递对象. 需要引入ksoap ...
- java实现利用httpclient访问接口
HTTP协议时Internet上使用的很多也很重要的一个协议,越来越多的java应用程序需要通过HTTP协议来访问网络资源. HTTPClient提供的主要功能: 1.实现了所有HTTP的方法(GET ...
- webservice的接口协议(HTTPClient 、RestTemplate HttpURLConnection)
HTTP协议时Internet上使用的很多也很重要的一个协议,越来越多的java应用程序需要通过HTTP协议来访问网络资源. HTTPClient提供的主要功能: 1.实现了所有HTTP的方法(GET ...
- (办公)访问其他系统接口httpClient,异步访问
访问其他系统接口httpClient,但是都是同步的,同步意味当前线程是阻塞的,只有本次请求完成后才能进行下一次请求;异步意味着所有的请求可以同时塞入缓冲区,不阻塞当前的线程; httpClient请 ...
- 使用HttpClient访问接口(Rest接口和普通接口)
这里总结一下使用HttpClient访问外部接口的用法.后期如果发现有什么缺陷会更改.欢迎读者指出此方法的不足之处. 首先,创建一个返回实体: public class HttpResult { // ...
- Java之HttpClient调用WebService接口发送短信源码实战
摘要 Java之HttpClient调用WebService接口发送短信源码实战 一:接口文档 二:WSDL 三:HttpClient方法 HttpClient方法一 HttpClient方法二 Ht ...
- C#动态webservice调用接口 (JAVA,C#)
C#动态webservice调用接口 using System; using System.Collections; using System.IO; using System.Net; using ...
随机推荐
- 洛谷 P4819 [中山市选]杀人游戏
洛谷 题目就是让我们在DAG中找到一些点,覆盖所有点. 因为是DAG,可以想到tarjan缩一下点.假设我们需要找x个点,那么答案就是(n-x)/n. 我们怎么选点呢? 敏锐的我们很快就能想到,直接选 ...
- 【25】session练习
#用登录练习session html1为首页,html2为登录页面 def session1(request): uname=request.session.get('myname','请登录') # ...
- MySQL中锁的类型
InnoDB存储引擎实现了一下两种标准的行级锁: 共享锁S LOCK 允许事务读一行数据 排他锁 X LOCK 允许事务删除或更新一行数据 如果是一个事务T1斤获得了行r的共享锁,那么另外一个事务T2 ...
- MySQL 5.6 死锁演示 及 日志分析
1. 表结构 CREATE TABLE dead_update ( a ) ', PRIMARY KEY (a) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; ), ...
- SQLtie 增删该查
建表,添加数据,更新数据,删除数据,删除表 . 先介绍三个核心方法 1.openDatabase:这个方法使用现有数据库或创建新数据库创建数据库对象. 2.transaction:这个方法允许我们根据 ...
- python爬取百度翻译返回:{'error': 997, 'from': 'zh', 'to': 'en', 'query 问题
解决办法: 修改url为手机版的地址:http://fanyi.baidu.com/basetrans User-Agent也用手机版的 测试代码: # -*- coding: utf-8 -*- & ...
- TCP协议的三次握手和四次挥手机制
核心知识点: 1.三次握手:seq和ack number 2.四次挥手:FIN和随机数 一.TCP/IP协议 TCP/IP协议(Transmission control protool/Interne ...
- python有哪些好的学习资料或者博客?
推荐Full Stack Python 有各种python资源汇总,从基础入门到各种框架web应用开发和部署,再到高级的ORM.Docker都有.以下是Full Stack Python 上总结的一些 ...
- vuex的 例子
最近在学习vuejs,一直有听说vuex,用来实现多组件共享的一种状态管理模式,但是网上都说,不要为了用vuex而用vuex,大概意思就是尽量少用vuex,一些小项目可以用bus来实现组件之间的传值问 ...
- Linux Shell编程 awk命令
概述 awk是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准输入(stdin).一个或多个文件,或其它命令的输出.它支持用户自定义函数和动态正则表达式等先进功能,是l ...