HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。如果只是需要向Web站点的某个简单页面提交请求并获取服务器响应,HttpURLConnection完全可以胜任。但在绝大部分情况下,Web站点的网页可能没这么简单,这些页面并不是通过一个简单的URL就可访问的,可能需要用户登录而且具有相应的权限才可访问该页面。在这种情况下,就需要涉及Session、Cookie的处理了,如果打算使用HttpURLConnection来处理这些细节,当然也是可能实现的,只是处理起来难度就大了。
为了更好地处理向Web站点请求,包括处理Session、Cookie等细节问题,Apache开源组织提供了一个HttpClient项目,看它的名称就知道,它是一个简单的HTTP客户端(并不是浏览器),可以用于发送HTTP请求,接收HTTP响应。但不会缓存服务器的响应,不能执行HTML页面中嵌入的Javascript代码;也不会对页面内容进行任何解析、处理。
简单来说,HttpClient就是一个增强版的HttpURLConnection,HttpURLConnection可以做的事情HttpClient全部可以做;HttpURLConnection没有提供的有些功能,HttpClient也提供了,但它只是关注于如何发送请求、接收响应,以及管理HTTP连接。
HttpClient的使用
使用HttpClient发送请求、接收响应很简单,只要如下几步即可。
1.创建HttpClient对象。
2.如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
3.如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HttpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
4.调用HttpClient对象的execute(HttpUriRequest request)发送请求,执行该方法返回一个HttpResponse。
5.调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
HttpGet方式获取数据
import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
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.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
public class HttpClientTest {
public static void main(String[] args) {
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
RequestConfig config = RequestConfig.custom()
.setConnectTimeout(60000)
.setConnectionRequestTimeout(60000)
.setSocketTimeout(60000)
.build();
HttpGet httpGet = new HttpGet("https://baike.baidu.com/item/httpclient/5766483?fr=aladdin");
httpGet.setConfig(config);
CloseableHttpResponse response = null;
try {
//执行httpGet请求
response = httpClient.execute(httpGet);
System.out.println(response.getStatusLine().getStatusCode());
//获取响应实体
HttpEntity httpEntity = response.getEntity();
if (httpEntity != null) {
System.out.println("长度:\t" + httpEntity.getContentLength());
System.out.println("内容:\t" + EntityUtils.toString(httpEntity,"UTF-8"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
response.close();
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
HttpPost方式获取数据
@Test
public void httpPost(){
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
HttpPost post = new HttpPost("http://localhost:8080/Servlet/do_login.do");
//设置post请求传递参数
List<NameValuePair> list = new ArrayList<>();
list.add(new BasicNameValuePair("username","test") );
list.add(new BasicNameValuePair("password","admin"));
try {
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list);
post.setEntity(entity);
}catch (Exception e){
e.printStackTrace();
}
//执行请求并处理响应
try{
CloseableHttpResponse response = httpClient.execute(post);
HttpEntity httpEntity = response.getEntity();
if(httpEntity!=null){
System.out.println(EntityUtils.toString(httpEntity,"UTF-8"));
}
response.close();
}catch (Exception e){
e.printStackTrace();
}finally {
try {
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}