HttpClient 详解
## 基础环境
### Maven pom
```html
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.3</version>
</dependency>
```
## HttpClient 设置Post参数
```
HttpPost httpPost = new HttpPost(url);
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("aaa", "x7AeuPz6dPPFaaKlXxvWVkiZu2Do25oHmRiLeWFM"));
nvps.add(new BasicNameValuePair("bbb", "bbb"));
httpPost.setEntity(new UrlEncodedFormEntity(nvps));
```
## HttpClient 设置Cookie
```
HttpPost httpPost = new HttpPost(url);
httpPost.setHeader("Cookie","jsessionid=6B6FE81CCBEB80A0017B11D8ED1915A2");
```
## HttpClient 设置Refere
```
HttpPost httpPost = new HttpPost(url);
httpPost.setHeader("Referer", "http://www.baidu.com");
```
## HttpClient 设置user-agent
```
String userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36";
CloseableHttpClient httpClient = HttpClients.custom().setUserAgent(userAgent).build();
```
## HttpClient 设置超时时间
### 全局设置
```
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(1000)
.setConnectTimeout(1000)
.build();
CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(defaultRequestConfig).build();
```
### 为单独的HttpGet/Post设置
```
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(1000)
.setConnectTimeout(1000)
.build();
HttpGet httpget = new HttpGet("http://localhost/1");
httpget.setConfig(requestConfig);
```
## HttpClient设置代理
```
// 代理地址,端口号,协议类型
HttpHost host = new HttpHost(ip, port, "http");
DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(host);
CloseableHttpClient httpClient = HttpClients.custom().setRoutePlanner(routePlanner).build();
```
## 完整示例
```java
package net.xsoftlab.baike;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.Consts;
import org.apache.http.HttpHost;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.DefaultProxyRoutePlanner;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
public class HttpClientTest {
private final int socketTimeout = 120 * 1000;
private final int connectTimeout = 120 * 1000;
private final String userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36";
/**
* 获取指定Url内容
*
* @param url
* @return
*/
private String getResponseBody(String url) throws IOException {
// 创建全局 RequestConfig ,并设置连接超时时间与数据响应超时时间
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(connectTimeout)
.setSocketTimeout(socketTimeout).build();
// 创建HttpClient
CloseableHttpClient httpClient = HttpClients.custom().setUserAgent(userAgent)
.setDefaultRequestConfig(requestConfig).build();
// 设置请求参数
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("aaa", "x7AeuPz6dPPFaaKlXxvWVkiZu2Do25oHmRiLeWFM"));
nvps.add(new BasicNameValuePair("bbb", "bbb"));
String param = EntityUtils.toString(new UrlEncodedFormEntity(nvps, Consts.UTF_8));
// 创建get请求
HttpGet httpGet = new HttpGet(url + "?" + param);
// 设置Cookie
httpGet.setHeader("Cookie", "jsessionid=6B6FE81CCBEB80A0017B11D8ED1915A2");
// 设置Referer
httpGet.setHeader("Referer", "http://www.baidu.com/");
// 获取响应结果
CloseableHttpResponse response = httpClient.execute(httpGet);
// 状态码
int status = response.getStatusLine().getStatusCode();
if (status == HttpStatus.SC_OK) {
return EntityUtils.toString(response.getEntity());
} else {
return "请求失败,status = " + status;
}
}
/**
* 使用代理获取Url内容
*
* @return
* @throws IOException
*/
public String getResponseBodyWithProxy(String ip, int port, String url) throws IOException {
// 代理地址,端口号,协议类型
HttpHost host = new HttpHost(ip, port, "http");
DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(host);
CloseableHttpClient httpClient = HttpClients.custom().setRoutePlanner(routePlanner).build();
// 创建get请求
HttpGet httpGet = new HttpGet(url);
// 获取响应结果
CloseableHttpResponse response = httpClient.execute(httpGet);
// 状态码
int status = response.getStatusLine().getStatusCode();
if (status == HttpStatus.SC_OK) {
return EntityUtils.toString(response.getEntity());
} else {
return "请求失败,status = " + status;
}
}
public static void main(String[] args) throws IOException {
String url = "http://baike.xsoftlab.net/view/956.html";
HttpClientTest test = new HttpClientTest();
String body = test.getResponseBody(url);
System.out.println("请求地址:" + url);
System.out.println(body);
url = "http://www.google.com/";
System.out.println("\n\n\n");
System.out.println("请求地址:" + url);
body = test.getResponseBodyWithProxy("127.0.0.1", 1080, url);
System.out.println(body);
}
}
```