采用Http连接池的方式,管理http的连接,这样可以减少每次请求创建、关闭连接的时间。
用httpclient工具包,可创建连接池,并对连接池中的http连接进行管理和设置。
1、设置http连接最大并发数
2、设置http连接最大连接时间
3、设置代理等
HTTP1.1规定Http请求的方式有 GET,POST,DELETE,PUT等方式,最高用的是GET,POST。
Get,向服务器获取数据。
Post,向服务器提交数据。
HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体.
使用httpclient,发送各类http请求
1、发送get请求
get请求,参数都在url中,所以无需单独做处理。直接设置头部信息即可。
1)使用HttpGet类,setConfig(连接池相关设置),addHeader(HTTP.CONTENT_ENCODING, "UTF-8")增加头部信息的字符编码格式
如果,get请求需要传递头部信息,需要 使用setHeader(key,value)设置参数值
2)使用已建立起的http连接,执行get请求
3)执行请求后,http会返回响应结果,可以通过CloseableHttpResponse 对象获取请求的响应状态,响应内容等
2、发送post请求
Http协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定提交的数据的编码方式。所以发送的Post请求的消息主体格式可以自由决定,只要最终发送的post 请求提交的消息主体满足指定的格式即可。
服务器内置了自动解析常见数据格式的功能,所以在解析post请求提交的数据时, 通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。
Post提交数据方式,对应的常用content-type取值
1)application/x-www-form-urlencoded,浏览器的原生表单提交
首先,Content-Type 被指定为 application/x-www-form-urlencoded;
其次,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。仿form表单提交数据的方式完成请求的。
与get请求不同的是,这种post请求方式,需要利用UrlEncodedFormEntity对象传入List集合来加载body.List集合的类型是NameValuePair接口,NameValuePair的实现类BasicNameValuePair类似于Map,可直接以key-value的形式传参。
通过setEntity(UrlEncodedFormEntity的实例)设置请求主体。
2)application/json 服务端消息主体是 JSON 字符串
针对json字符串作为消息主体的处理,需要使用StringEntity对象
用加载过json的StringEntity实例对象设置json的编码格式setContentEncoding(编码格式),设置setContentType为application/json。
最后,将StringEntity实例对象设置到HttpPost请求中setEntity。
其他部分,如设置Header,执行post请求的发送,同get请求
3)multipart/form-data 表单上传文件
HttpCient4.3之后上传文件主要使用的类是位于org.apache.http.entity.mime下的MultipartEntityBuilder.上传文件需要将文件转化成字节。基本实现步骤如下:
a.设置上传的模式;
setMode(HttpMultipartMode mode),其中mode主要有BROWSER_COMPATIBLE,RFC6532,STRICT三种,默认值是STRICT。
b.利用MultipartEntityBuilder.create()来创建MultipartEntityBuilder对象;
c.添加需要上传的数据,使用addBinaryBody(以二进制的形式添加数据)
addBinaryBody(String name, File file, ContentType contentType, String filename)
addBinaryBody(String name, InputStream stream, ContentType contentType, String filename)
addBinaryBody(String name, byte[] b, ContentType contentType, String filename)
d.添加文本数据,使用addTextBody
addTextBody(String name, String text, ContentType contentType)
测试中选用了addBinaryBody。其中,第一个参数name的值,是服务器已经定义好的,服务器会根据这个字段来读取我们上传的文件流,不匹配则会报错。
e.将MultipartEntityBuilder对象的build结果设置到HttpPost请求中setEntity
其他部分,如设置Header,执行post请求的发送,同get请求
下载文件,只需要将post的响应结果,写入到指定文件中即可
可以使用FileUtils.copyToFile(response.getEntity().getContent(),descfile)方法
4)text/xml XML 作为编码方式
XML 有两种 MIME 媒体类型:text/xml 和 application/xml。
这两种类型主要是对头的处理不同,application/xml 会根据头编码,而text/xml 会忽略头,所以建议用前者。
即当要指定头部编码时使用application/xml<?xml version='1.0' encoding='GBK>。无需指定头部编码可以使用text/html,则数据传输默认使用us-ascii编码编码。