HttpClient定义
HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包。
HttpClient作用
HTTP Client和浏览器有点像,都可以用来发送请求,接收服务端响应的数据,但它不是浏览器,没有用户界面,只通过其API用于传输和接受HTTP消息。
HttpClient功能
HttpClient的主要功能,包含如下:
- 基于标准的java语言实现了Http1.0和Http1.1等;
- 实现了所有 HTTP 的方法,比如:GET、POST、PUT、HEAD、DELETE、HEAD、OPTIONS 等;
- 支持 HTTPS 协议;
- 支持代理服务器,比如:Nginx等;
- 支持自动跳转转向等;
HttpClient使用步骤
使用HttpClient发送请求接收响应很简单,一般需要如下六步即可:
第一步: 创建HttpClient对象
CloseableHttpClient HttpClient = HttpClientBuilder.create().build();
提示:推荐用CloseableHttpClient,HttpClient是历史遗留版本,官方推荐使用CloseableHttpClient。
第二步:创建请求方法的实例,并指定请求URL。
如果需要发送GET请求,创建HttpGet对象。
HttpGet httpGet = new HttpGet("https://mikechen.cc");
如果需要发送POST请求,创建HttpPost对象。
HttpPost httppost = new HttpPost("https://mikechen.cc");
第三步:设置发送请求参数
如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HttpParams params)方法来添加请求参数。
第四步:调用execute发送请求
HttpResponse response = HttpClient.execute(httpGet);
发送请求,该方法返回一个HttpResponse。
第五步:获取请求内容
调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。
//调用HttpResponse的getEntity()方法可获取HttpEntity对象 HttpEntity resEntity = response.getEntity();
调用HttpResponse的getEntity()方法,程序可通过该对象获取服务器的响应内容。
第六步:释放连接
response.close(); HttpClient.close();
无论执行方法是否成功,都必须释放连接。
HttpClient使用实例
下面我们一起再看下完整的HttpClient使用实例。
1.添加HttpClient依赖
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/HttpClient --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>HttpClient</artifactId> <version>5.2</version> </dependency>
2.发送GET请求
HttpClient发送GET请求的例子,如下所示:
public void doGetTestOne() { // 获得Http客户端(可以理解为:你得先有一个浏览器;注意:实际上HttpClient与浏览器是不一样的) CloseableHttpClient HttpClient = HttpClientBuilder.create().build(); // 创建Get请求 HttpGet httpGet = new HttpGet("https://mikechen.cc/item/1/31661"); // 响应模型 CloseableHttpResponse response = null; try { // 由客户端执行(发送)Get请求 response = HttpClient.execute(httpGet); // 从响应模型中获取响应实体 HttpEntity responseEntity = response.getEntity(); System.out.println("响应状态为:" + response.getStatusLine()); if (responseEntity != null) { System.out.println("响应内容长度为:" + responseEntity.getContentLength()); System.out.println("响应内容为:" + EntityUtils.toString(responseEntity)); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { // 释放资源 if (HttpClient != null) { HttpClient.close(); } if (response != null) { response.close(); } } catch (IOException e) { e.printStackTrace(); } } }
GET请求的参数传递是通过URL拼接来实现的,所以,我们想发送带参数的Get请求,可直接拼接在ulr后。
3.发送POST请求
/* * 封装HttpClient发送post请求的工具类 * */ public class HttpClientUtils { //私有化构造器,防止HttpClientUtils被创建对象 private HttpClientUtils(){ } static CloseableHttpClient closeableHttpClient = HttpClients.createDefault(); //HttpPost的请求执行 public static String sendHttpPost(String url, JSONObject JsonValues) throws UnsupportedEncodingException { HttpClientUtils = HttpClientUtils.getHttpClientUtils(); //获取HttpPost HttpPost httpPost = new HttpPost(url); //设置请求头 httpPost.setHeader("x-appid", "test"); httpPost.setHeader("x-client-version", "4.0.0"); httpPost.setHeader("Content-Type","application/json"); // 设置请求体 StringEntity entity = new StringEntity(JsonValues.toString()); httpPost.setEntity(entity); String content = null; try { CloseableHttpResponse responseTest = closeableHttpClient.execute(httpPost); if (responseTest.getStatusLine().getStatusCode() == 200) { // 获取响应实体 HttpEntity resTestEntity = responseTest.getEntity(); // 输出响应 content = EntityUtils.toString(resTestEntity, "utf-8"); }else { System.out.println("无效请求"); } responseTest.close(); } catch (IOException e) { e.printStackTrace(); } try { closeableHttpClient.close(); } catch (IOException e) { e.printStackTrace(); } return content; } }
mikechen
mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!

后台回复【架构】即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》