Java HttpClient库的使用

Posted 键盘上的手艺人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java HttpClient库的使用相关的知识,希望对你有一定的参考价值。

(一)简介

HttpClient是Apache的一个开源库,相比于JDK自带的URLConnection等,使用起来更灵活方便。

使用方法可以大致分为如下八步曲:

1、创建一个HttpClient对象;

2、创建一个Http请求对象并设置请求的URL,比如GET请求就创建一个HttpGet对象,POST请求就创建一个HttpPost对象;

3、如果需要可以设置请求对象的请求头参数,也可以往请求对象中添加请求参数;

4、调用HttpClient对象的execute方法执行请求;

5、获取请求响应对象和响应Entity;

6、从响应对象中获取响应状态,从响应Entity中获取响应内容;

7、关闭响应对象;

8、关闭HttpClient.

 

(二)在本地创建一个Servlet程序

在本地创建一个Servlet程序并跑在Tomcat服务器中,主要用于下一步测试HttpClient发送请求。

注:Servlet的创建方法详见:微信公众号开发【技术基础】(一):Eclipse+Tomcat搭建本地服务器并跑通HelloWorld程序

1、Servlet类:

 1 import java.io.PrintWriter;
 2 
 3 import javax.servlet.http.HttpServlet;
 4 import javax.servlet.http.HttpServletRequest;
 5 import javax.servlet.http.HttpServletResponse;
 6 
 7 public class HelloWorld extends HttpServlet {
 8     private static final long serialVersionUID = 4601029764222607869L;
 9 
10     @Override
11     protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
12         // 1. 设置编码格式
13         resp.setContentType("text/html");
14         resp.setCharacterEncoding("UTF-8");
15 
16         // 2. 往返回体中写返回数据
17         PrintWriter writer = null;
18         try {
19             writer = resp.getWriter();
20             writer.print("Hello world! 你好,世界!!");
21         } catch (Exception e) {
22             e.printStackTrace();
23         } finally {
24             writer.close();
25         }
26     }
27 
28     @Override
29     protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
30         // 1. 获取请求的参数
31         String userName = req.getParameter("username");
32         String password = req.getParameter("password");
33 
34         // 2. 往返回体写返回数据
35         PrintWriter writer = null;
36         try {
37             writer = resp.getWriter();
38             writer.print("your username is:" + userName + "\\nyour password is:" + password);
39         } catch (Exception e) {
40             e.printStackTrace();
41         } finally {
42             writer.close();
43         }
44     }
45 
46 }

 

2、web.xml(新加内容):

1   <servlet>
2         <servlet-name>helloWorld</servlet-name>
3         <servlet-class>com.servlet.HelloWorld</servlet-class>
4     </servlet>
5 
6     <servlet-mapping>
7         <servlet-name>helloWorld</servlet-name>
8         <url-pattern>/hello</url-pattern>
9     </servlet-mapping>

 

(三)测试HttpClient发送GET和POST请求

1、HttpClient测试类:

  1 package com.test.method;
  2 
  3 import java.io.IOException;
  4 import java.io.UnsupportedEncodingException;
  5 import java.util.ArrayList;
  6 import java.util.List;
  7 
  8 import org.apache.http.HttpEntity;
  9 import org.apache.http.NameValuePair;
 10 import org.apache.http.ParseException;
 11 import org.apache.http.client.ClientProtocolException;
 12 import org.apache.http.client.entity.UrlEncodedFormEntity;
 13 import org.apache.http.client.methods.CloseableHttpResponse;
 14 import org.apache.http.client.methods.HttpGet;
 15 import org.apache.http.client.methods.HttpPost;
 16 import org.apache.http.impl.client.CloseableHttpClient;
 17 import org.apache.http.impl.client.HttpClients;
 18 import org.apache.http.message.BasicNameValuePair;
 19 import org.apache.http.util.EntityUtils;
 20 
 21 /**
 22  * 测试HttpClient发送各种请求的方法
 23  * 
 24  * @author Administrator
 25  *
 26  */
 27 public class HttpClientTest {
 28     // 发送请求的url
 29     public static final String REQUEST_URL = "http://localhost:8080/TomcatTest/hello";
 30 
 31     /**
 32      * 测试发送GET请求
 33      */
 34     public void get() {
 35         // 1. 创建一个默认的client实例
 36         CloseableHttpClient client = HttpClients.createDefault();
 37 
 38         try {
 39             // 2. 创建一个httpget对象
 40             HttpGet httpGet = new HttpGet(REQUEST_URL);
 41             System.out.println("executing GET request " + httpGet.getURI());
 42 
 43             // 3. 执行GET请求并获取响应对象
 44             CloseableHttpResponse resp = client.execute(httpGet);
 45 
 46             try {
 47                 // 4. 获取响应体
 48                 HttpEntity entity = resp.getEntity();
 49                 System.out.println("------");
 50 
 51                 // 5. 打印响应状态
 52                 System.out.println(resp.getStatusLine());
 53 
 54                 // 6. 打印响应长度和响应内容
 55                 if (null != entity) {
 56                     System.out.println("Response content length = " + entity.getContentLength());
 57                     System.out.println("Response content is:\\n" + EntityUtils.toString(entity));
 58                 }
 59 
 60                 System.out.println("------");
 61             } finally {
 62                 // 7. 无论请求成功与否都要关闭resp
 63                 resp.close();
 64             }
 65         } catch (ClientProtocolException e) {
 66             e.printStackTrace();
 67         } catch (ParseException e) {
 68             e.printStackTrace();
 69         } catch (IOException e) {
 70             e.printStackTrace();
 71         } finally {
 72             // 8. 最终要关闭连接,释放资源
 73             try {
 74                 client.close();
 75             } catch (Exception e) {
 76                 e.printStackTrace();
 77             }
 78         }
 79     }
 80 
 81     /**
 82      * 测试发送POST请求
 83      */
 84     public void post() {
 85         // 1. 获取默认的client实例
 86         CloseableHttpClient client = HttpClients.createDefault();
 87         // 2. 创建httppost实例
 88         HttpPost httpPost = new HttpPost(REQUEST_URL);
 89         // 3. 创建参数队列(键值对列表)
 90         List<NameValuePair> paramPairs = new ArrayList<NameValuePair>();
 91         paramPairs.add(new BasicNameValuePair("username", "admin"));
 92         paramPairs.add(new BasicNameValuePair("password", "123456"));
 93 
 94         UrlEncodedFormEntity entity;
 95 
 96         try {
 97             // 4. 将参数设置到entity对象中
 98             entity = new UrlEncodedFormEntity(paramPairs, "UTF-8");
 99 
100             // 5. 将entity对象设置到httppost对象中
101             httpPost.setEntity(entity);
102 
103             System.out.println("executing POST request " + httpPost.getURI());
104 
105             // 6. 发送请求并回去响应
106             CloseableHttpResponse resp = client.execute(httpPost);
107 
108             try {
109                 // 7. 获取响应entity
110                 HttpEntity respEntity = resp.getEntity();
111 
112                 // 8. 打印出响应内容
113                 if (null != respEntity) {
114                     System.out.println("------");
115                     System.out.println(resp.getStatusLine());
116                     System.out.println("Response content is : \\n" + EntityUtils.toString(respEntity, "UTF-8"));
117 
118                     System.out.println("------");
119                 }
120             } finally {
121                 // 9. 关闭响应对象
122                 resp.close();
123             }
124 
125         } catch (ClientProtocolException e) {
126             e.printStackTrace();
127         } catch (UnsupportedEncodingException e) {
128             e.printStackTrace();
129         } catch (IOException e) {
130             e.printStackTrace();
131         } finally {
132             // 10. 关闭连接,释放资源
133             try {
134                 client.close();
135             } catch (Exception e) {
136                 e.printStackTrace();
137             }
138         }
139     }
140 
141     public static void main(String[] args) {
142         HttpClientTest test = new HttpClientTest();
143         // 测试GET请求
144         test.get();
145         // 测试POST请求
146         test.post();
147     }
148 }

 

2、输出结果:

executing GET request http://localhost:8080/TomcatTest/hello
------
HTTP/1.1 200 OK
Response content length = 34
Response content is:
Hello world! 你好,世界!!
------
executing POST request http://localhost:8080/TomcatTest/hello
------
HTTP/1.1 200 OK
Response content is :
your username is:admin
your password is:123456
------

 

 (四)jar包下载

所需jar包打包下载地址:https://pan.baidu.com/s/1mhJ9iT6

以上是关于Java HttpClient库的使用的主要内容,如果未能解决你的问题,请参考以下文章

接口-httpClient

HttpClient“任务被取消”

WP8,怎么使用HttpClient?

HttpClient 和 windows phone 8 便携版

在 Java 11 及更高版本中使用 HttpClient 时如何跟踪 HTTP 303 状态代码?

使用 Pygments 检测代码片段的编程语言