HttpClient顾名思义就是一个Http客户端。最常见的HTTP客户端就是浏览器,可是并不意味着HttpClient也是浏览器,他只是一个能够提供Http连接的客户端而已。
想要了解HttpClient是什么,就必须要了解HTTP请求。一个HTTP请求分为请求和响应,那么HttpClient要想实现HTTP请求连接,就必须要实现能够发送请求和响应。首先我们来看一个HTTP请求:
Request URL: https://www.youkuaiyun.com/
Request Method: GET
Status Code: 200 OK
Remote Address: 47.95.164.112:443
Referrer Policy: unsafe-url
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html; charset=UTF-8
Date: Sat, 11 Aug 2018 03:59:46 GMT
Keep-Alive: timeout=20
Server: openresty
Strict-Transport-Security: max-age= 31536000
Transfer-Encoding: chunked
Vary: Accept-Encoding
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Connection: keep-alive
Cookie: uuid_tt_dd=10_20323630930-1531123659711-444931; __utma=17226283.291028385.1531126861.1531126861.1531126861.1; __utmz=17226283.1531126861.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; Hm_ct_6bcd52f51e9b3dce32bec4a3997715ac=1788*1*PC_VC; smidV2=20180716211318757480c3c52e2675cd2ea0144523f27b003d5bdece4d90a50; dc_session_id=10_1532921500961.294926; Hm_lvt_6bcd52f51e9b3dce32bec4a3997715ac=1533954154,1533956297,1533956307,1533959726; UserName=Tony_Key; UserInfo=dnvQh6JIgd%2Bur%2Bygxc0WjdZPJiv1Y%2Fdjj7U94flkxbp4y4bdbMbrlZIgoK1D%2Fy86eEghI9NBbSisRIVWeeW%2FoXeQp7kDTbVTsdHVwskiO6Q8UgFHIbJJcyAhYRACamOz; UserNick=%E9%98%BF%E8%9E%AD; UN=Tony_Key; AU=CD7; BT=1533959761563; UserToken=dnvQh6JIgd%2Bur%2Bygxc0WjdZPJiv1Y%2Fdjj7U94flkxbp4y4bdbMbrlZIgoK1D%2Fy86eEghI9NBbSisRIVWeeW%2FoXeQp7kDTbVTsdHVwskiO6Ss3Sdnz9eSJjdnf8LjJnkfjEJLVVoIuZOlvwXiha%2BeH4WCNsEYnO2FvvbhcJ4uhyQ%3D; TY_SESSION_ID=4fcf50fb-8a8e-42d4-af57-69409d2919d3; ADHOC_MEMBERSHIP_CLIENT_ID1.0=c4c9e127-0aa4-f651-ddeb-00f1d2bb24c1; Hm_lpvt_6bcd52f51e9b3dce32bec4a3997715ac=1533959774; dc_tos=pda2xr
Host: www.youkuaiyun.com
Referer: https://passport.youkuaiyun.com/account/login_mobile_verification_code
Upgrade-Insecure-Requests: 1
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
一个HTTP请求包含了请求URL,请求方式,请求头和响应状态响应码。我们通过功能来看HttpClient的实现。那么我们需要知道,如何来创建客户端,如何来创建HTTP请求,请求中包含请求头和请求体,那么如何来操作请求头,如何来操作请求体,如何发送请求,如何接收响应,如何获取响应的内容。其实HTTP请求也就这么多内容,那么只要我们搞懂上面的问题,也算是入门了。
首先需要创建一个能够发送HTTP请求的客户端
//一个HTTP客户端。并不是代表浏览器,只是代表一个能够发送HTTP请求的客户端
HttpClient httpClient = new DefaultHttpClient();
DefaultHttpClinet就是HttpClient的默认实现,创建DefaultHttpClient我们完成了请求的第一步,实现了一个HTTP请求的客户端,现在,我们具有了能够发送HTTP请求的功能。第二步我们需要做的是发送HTTP请求。HTTP请求又包含很多中方式,比如:GET,HEAD,POST,PUT,DELETE, TRACE 和 OPTIONS,我们以GET请求为例,创建一个GET请求对象。
HttpGet httpGet = new HttpGet("http://www.baidu.com");
HttpGet就是HttpClient对HTTP请求的一个封装。我们不需要把它想象的有多么复杂,它不是一个深奥的东西,仅仅只是封装了一个GET请求方式的HTTP请求。那么我们很容易的就能想象出来它的具体功能是什么,具有哪些内容。依旧坚持我们的理念,根据需求来看实现。
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Connection: keep-alive
Cookie: uuid_tt_dd=10_20323630930-1531123659711-444931; __utma=17226283.291028385.1531126861.1531126861.1531126861.1; __utmz=17226283.1531126861.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; Hm_ct_6bcd52f51e9b3dce32bec4a3997715ac=1788*1*PC_VC; smidV2=20180716211318757480c3c52e2675cd2ea0144523f27b003d5bdece4d90a50; dc_session_id=10_1532921500961.294926; Hm_lvt_6bcd52f51e9b3dce32bec4a3997715ac=1533954154,1533956297,1533956307,1533959726; UserName=Tony_Key; UserInfo=dnvQh6JIgd%2Bur%2Bygxc0WjdZPJiv1Y%2Fdjj7U94flkxbp4y4bdbMbrlZIgoK1D%2Fy86eEghI9NBbSisRIVWeeW%2FoXeQp7kDTbVTsdHVwskiO6Q8UgFHIbJJcyAhYRACamOz; UserNick=%E9%98%BF%E8%9E%AD; UN=Tony_Key; AU=CD7; BT=1533959761563; UserToken=dnvQh6JIgd%2Bur%2Bygxc0WjdZPJiv1Y%2Fdjj7U94flkxbp4y4bdbMbrlZIgoK1D%2Fy86eEghI9NBbSisRIVWeeW%2FoXeQp7kDTbVTsdHVwskiO6Ss3Sdnz9eSJjdnf8LjJnkfjEJLVVoIuZOlvwXiha%2BeH4WCNsEYnO2FvvbhcJ4uhyQ%3D; TY_SESSION_ID=4fcf50fb-8a8e-42d4-af57-69409d2919d3; ADHOC_MEMBERSHIP_CLIENT_ID1.0=c4c9e127-0aa4-f651-ddeb-00f1d2bb24c1; Hm_lpvt_6bcd52f51e9b3dce32bec4a3997715ac=1533959774; dc_tos=pda2xr
Host: www.youkuaiyun.com
Referer: https://passport.youkuaiyun.com/account/login_mobile_verification_code
Upgrade-Insecure-Requests: 1
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
我们需要创建一个GET的请求方式,那么我必须告诉HttpClient,请求地址是哪里,这是必须的。如果我想修改,删除,查询请求头的信息,那么该封装对象还应该给我提供对请求头进行操作的方法。首先我们来看一下如何来操作URL
//方式1:直接指定URL创建HttpGet对象
HttpGet httpGet = new HttpGet("http://www.baidu.com");
//方式2:通过URI对象来设置
List<NameValuePair> qparams = new ArrayList<>();
qparams.add(new BasicNameValuePair("q", "httpclient"));
qparams.add(new BasicNameValuePair("btnG", "Google Search"));
qparams.add(new BasicNameValuePair("aq", "f"));
qparams.add(new BasicNameValuePair("oq", null));
//可以看出来,BasicNameValuePair对象也是一个以Key-Value形式的对象。
//该对象其实仅仅只是表示一行参数,我们访问资源的参数,Key为参数名,Value为参数值。
//举一反三,那么其他任何请求方式,如果需要设置参数,那么就可以通过创建NameValuePair对象
//即可满足设置带有名称的参数。
URI uri = URIUtils.createURI("http", "www.baidu.com", -1, "/search", URLEncodedUtils.format(qparams, "UTF-8"), null);
HttpGet httpget = new HttpGet(uri);
System.out.println(httpget.getURI());
现在,我们已经掌握了如何来设置URL,下面我们开始要来学习如何来操作HTTP请求的Header
//封装了一个GET请求的对象
HttpGet httpGet = new HttpGet("http://www.baidu.com");
//通过httpGet.getAllHeaders获取所有的请求头信息。HttpClient中,所有的头信息都是通过Header来实现的。
Header [] headers = httpGet.getAllHeaders();
for(Header header : headers){
System.out.println(header.getName() + " : " + header.getValue());
}
//我们可以通过Key-value的方式来添加请求头
httpGet.setHeader("Content-Type","text/html");
//或者创建Header对象来添加请求头
Header header = new BasicHeader("Content-Type","text/html");
httpGet.setHeader(header);
//通过removeHeaders来移除某个请求头,传入的参数为请求头的名称。
httpGet.removeHeaders("Content");
现在,我们能够随意的控制请求头了。就是如此的简单。