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("长度: " + httpEntity.getContentLength()); System.out.println("内容: " + 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(); } } }