一、HTTP简介
HTTP(Hyper Text Transfer Protocol,超文本传输协议)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。它是一个应用层协议,承载于TCP之上。由请求和响应构成,是一个标准的客户端服务器模型。
URL(Uniform Resource Locator)中文名为统一资源定位符,有时也被俗称为网页地址。表示为互联网上的资源,如网页或者FTP地址。
HTTP 协议的 URL 实例如下:
http://www.runoob.com/index.html?language=cn#j2se
URL 解析:
- 协议为(protocol):http
- 主机为(host:port):www.runoob.com
- 端口号为(port): 80 ,以上URL实例并未指定端口,因为 HTTP 协议默认的端口号为 80。
- 文件路径为(path):/index.html
- 请求参数(query):language=cn
- 定位位置(fragment):j2se,定位到网页中 id 属性为 j2se 的 HTML 元素位置 。
二、HttpURLConnection
Java 自带的 java.net
这个包中包含了很多与网络请求相关的类
1 创建 HTTP 连接对象
要得到一个 HttpURLConnection
HTTP 连接对象,首先需要一个 URL
,代码如下:
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
2 添加 HTTP 请求头
得到 HTTP 连接对象之后,我们就可以进行 HTTP 操作了,我们可以添加任意的 HTTP 请求头,然后执行我们需要的 GET 或者 POST 请求。我们像下面这样,添加两个 HTTP 头(User-Agent 和 Accept-Language):
con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) ...");
con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
对于有些爬虫来说,这个设置是必要的,譬如有很多网站会对请求头中的 Referer 进行检查,以此来防爬或者防盗链。又譬如有些网站还会对 User-Agent 进行检查,根据这个字段来过滤一些非浏览器的请求。如果请求头设置不对的话,很可能是爬不下正确的数据的。
3 HTTP GET
HTTP 协议中定义了很多种 HTTP 请求方法:GET、POST、PUT、DELETE、OPTIONS 等等,其中最常用到的就是 GET 和 POST,因为在浏览器中大多都是使用这两种请求方法。
使用 HttpURLConnection
来发送 GET 请求是非常简单的,通过上面的代码创建并初始化好一个 HTTP 连接之后,就可以直接来发送 GET 请求了。
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
String responseBody = readResponseBody(con.getInputStream());
可以看到,代码非常简洁,没有任何累赘的代码,甚至没有任何和发送请求相关的代码,请求就是在 getResponseCode()
函数中默默的执行了。其中 readResponseBody()
函数用于读取流并转换为字符串,具体的实现如下:
// 读取输入流中的数据
private String readResponseBody(InputStream inputStream) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
return response.toString();
}
4 HTTP POST
使用 HttpURLConnection
来模拟 POST 请求和 GET 请求基本上是一样的,但是有一点不同,由于 POST 请求一般都会向服务端发送一段数据,所以 HttpURLConnection
提供了一个方法 setDoOutput(true)
来表示有数据要输出给服务端,并可以通过 getOutputStream()
得到输出流,我们将要写的数据通过这个输出流 POST 到服务端。
con.setRequestMethod("POST");
con.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.writeBytes(parameter);
wr.flush();
wr.close();
POST 完成之后,和 GET 请求一样,我们通过 getInputStream()
函数来读取服务端返回的数据。
三、HttpClient
HttpClient
是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包。它相比传统的 HttpURLConnection
,增加了易用性和灵活性,它不仅让客户端发送 HTTP 请求变得更容易,而且也方便了开发人员测试接口(基于 HTTP 协议的),即提高了开发的效率,也方便提高代码的健壮性。
1、使用方法
- 创建HttpClient对象。
- 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
- 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
- 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。
- 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
- 释放连接。无论执行方法是否成功,都必须释放连接
CloseableHttpClient httpclient = HttpClients.createDefault(); //创建httpclient
HttpGet httpGet = new HttpGet("https://www.cnblogs.com"); //创建get 请求
CloseableHttpResponse response = httpclient.execute(httpGet); //通过httpcleint 发送get 请求
if(response != null)
{
HttpEntity httpentity = response.getEntity(); //获取响应
System.out.println(EntityUtils.toString(httpentity,"UTF-8")); //采用工具来将实体进行转换输出
}
response.close();
httpclient.close()
具体参考文章httpclient 学习