由于博主昨天已经学习完了Jsoup的相关知识,所以今天开始学习HttpClient的操作使用。但是在学习HttpClient时,因为是刚入门,尽管网上资料一搜一大把但是博主发现这些资料都是思路混乱、较难理解(可能是因为我原来是文科生的缘故?)。
HttpClient是什么?
HttpClient(HTTP协议客户端→网络请求框架)是Apache Jakarta Common下的子项目,用来提供高效的、功能丰富的、支持HTTP协议的客户端编程工具包。相比于java.net包中提供的URLConnection与HttpURLConnection,HttpClient增加了易用性和灵活性。在Java网络爬虫中,经常使用HttpClient向服务器发送请求以获取相应资源。
下载HttpClient的jar包
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.4</version>
</dependency>
执行请求与获取响应信息
package com.test.study;
import java.io.IOException;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.ParseException;
import org.apache.http.ProtocolVersion;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;
public class TestHttpClient {
public static void main(String[] args) throws ParseException, IOException {
// 初始化HttpContext
HttpContext localContext = new BasicHttpContext();
String url = "http://www.hakutaku.club";
// 初始化HttpClient
HttpClient httpClient = HttpClients.custom().build();
HttpGet httpGet = new HttpGet(url);
// 执行请求获取HttpResponse
HttpResponse httpResponse = null;
try {
httpResponse = httpClient.execute(httpGet, localContext); // 执行请求,获取响应信息
} catch (IOException e) {
e.printStackTrace();
}
// 获取具体响应信息
System.out.println("response: " + httpResponse);
// 响应状态
String status = httpResponse.getStatusLine().toString();
System.out.println("status: " + status);
// 获取响应状态码
int StatusCode = httpResponse.getStatusLine().getStatusCode();
System.out.println("StatusCode: " + StatusCode);
// 获取协议的版本号
ProtocolVersion protocolVersion = httpResponse.getProtocolVersion();
System.out.println("protocolVersion: " + protocolVersion);
// 是否OK
String phrase = httpResponse.getStatusLine().getReasonPhrase();
System.out.println("phrase: " + phrase);
// 头信息
Header[] headers = httpResponse.getAllHeaders();
System.out.println("==========输出头信息==========");
for(int i = 0; i < headers.length; i++) {
System.out.println(headers[i]);
}
System.out.println("=========头信息输出结束=========");
// 实体内容
if(StatusCode == HttpStatus.SC_OK) { // 状态码200表示响应成功
// 获取实体内容
HttpEntity entity = httpResponse.getEntity();
// 注意设置编码
String entityString = EntityUtils.toString(entity, "gbk");
// 输出实体内容
System.out.println(entityString);
EntityUtils.consume(httpResponse.getEntity()); // 消耗实体
}else {
// 关闭HttpEntity的流实体
EntityUtils.consume(httpResponse.getEntity()); // 消耗实体
}
}
}
在上述代码中,我使用的测试网站是我的个人博客(http://www.hakutaku.club)。具体的语句实现功能我在代码中标注的也很清楚,只说一下最后的语句**EntityUtils.consume()**吧。
EntityUtils.consume(): 释放实体。实体是资源,在不需要资源时应将其释放。