在 Web 开发中,经常需要向远程服务器发送 HTTP 请求并处理响应。Java 提供了多种发送 HTTP 请求的方式,其中比较常用的方式是使用 HttpClient 库。HttpClient 是 Apache 开源组织提供的一个 Java HTTP 客户端库,可以用来模拟浏览器发送 HTTP 请求和处理 HTTP 响应。
一、HttpClient 的基本使用方法
HttpClient 库提供了多种 HTTP 请求方法,包括 GET、POST、PUT、DELETE 等。下面我们将以 GET 请求为例,介绍 HttpClient 的基本使用方法。
首先需要导入 HttpClient 库的相关类:
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
然后可以创建 HttpClient 实例:
HttpClient client = HttpClientBuilder.create().build();
接下来,可以创建 HttpGet 实例,设置请求的 URL:
String url = "http://www.weather.com.cn/weather/101100101.shtml";
HttpGet request = new HttpGet(url);
可以通过设置请求头来模拟浏览器发送 HTTP 请求。例如,设置 User-Agent、Accept、Referer 等请求头:
request.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3");
request.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
request.setHeader("Referer", "http://www.weather.com.cn/");
设置完请求头后,就可以执行 HTTP 请求并获取 HTTP 响应了:
HttpResponse response = client.execute(request);
二、解析 HTTP 响应
HttpClient 返回的 HttpResponse 对象包含了 HTTP 响应的所有信息,包括状态码、响应头、响应体等。下面我们将介绍如何解析 HTTP 响应。
首先可以获取 HTTP 响应的状态码:
int statusCode = response.getStatusLine().getStatusCode();
如果状态码是 200,则表示 HTTP 请求成功,可以获取响应体:
if (statusCode == 200) {
String responseString = EntityUtils.toString(response.getEntity());
System.out.println(responseString);
}
在获取响应体后,可以使用类似于 jQuery 的选择器来解析 HTML 数据。Java 提供了多种 HTML 解析库,例如 Jsoup、HtmlUnit 等。下面我们将以 Jsoup 为例,介绍如何解析 HTML 数据。
首先需要导入 Jsoup 库的相关类:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document
然后,可以将获取的响应体传递给 Jsoup 的 parse 方法,解析成 Document 对象:
Document document = Jsoup.parse(responseString);
接下来,就可以使用 Jsoup 提供的类似于 jQuery 的选择器来查找 HTML 元素了。例如,获取天气预报信息:
String todayWeather = document.select(".today .wea").text();
String todayTemperature = document.select(".today .tem").text();
String tomorrowWeather = document.select(".tommorrow .wea").text();
String tomorrowTemperature = document.select(".tommorrow .tem").text();
这里使用了 Jsoup 的 select 方法,传递了一个类似于 CSS 选择器的字符串,表示要查找的 HTML 元素。例如,".today .wea" 表示查找 class 属性为 "today" 的元素下的 class 属性为 "wea" 的元素。
完整可运行的示例
下面提供一个完整可运行的示例,用于获取天气信息并解析 HTML 数据:
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.IOException;
public class WeatherExample {
public static void main(String[] args) throws IOException {
String url = "http://www.weather.com.cn/weather/101100101.shtml";
HttpClient client = HttpClientBuilder.create().build();
HttpGet request = new HttpGet(url);
request.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3");
request.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
request.setHeader("Referer", "http://www.weather.com.cn/");
HttpResponse response = client.execute(request);
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) {
String responseString = EntityUtils.toString(response.getEntity());
Document document = Jsoup.parse(responseString);
//自行解析吧
}
}
}
总结: 本文介绍了如何使用 Java 的 HttpClient 库发送 HTTP 请求并处理响应,包括如何构建 HTTP 请求、如何添加请求头、如何处理 HTTP 响应等。此外,在实际开发中,还需要考虑网络超时、连接池管理等方面的问题,需要对 HttpClient 进行更多的配置和调优。
总之,使用 HttpClient 可以方便地发送 HTTP 请求并处理响应,是 Java 开发中常用的网络编程工具之一。在实际开发中,可以根据具体的需求进行定制化的配置和使用,以达到更好的效果和性能。