(一)简介

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类:

 import java.io.PrintWriter;

 import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class HelloWorld extends HttpServlet {
private static final long serialVersionUID = 4601029764222607869L; @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
// 1. 设置编码格式
resp.setContentType("text/html");
resp.setCharacterEncoding("UTF-8"); // 2. 往返回体中写返回数据
PrintWriter writer = null;
try {
writer = resp.getWriter();
writer.print("Hello world! 你好,世界!!");
} catch (Exception e) {
e.printStackTrace();
} finally {
writer.close();
}
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
// 1. 获取请求的参数
String userName = req.getParameter("username");
String password = req.getParameter("password"); // 2. 往返回体写返回数据
PrintWriter writer = null;
try {
writer = resp.getWriter();
writer.print("your username is:" + userName + "\nyour password is:" + password);
} catch (Exception e) {
e.printStackTrace();
} finally {
writer.close();
}
} }

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

   <servlet>
<servlet-name>helloWorld</servlet-name>
<servlet-class>com.servlet.HelloWorld</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>helloWorld</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>

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

1、HttpClient测试类:

 package com.test.method;

 import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List; import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
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.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils; /**
* 测试HttpClient发送各种请求的方法
*
* @author Administrator
*
*/
public class HttpClientTest {
// 发送请求的url
public static final String REQUEST_URL = "http://localhost:8080/TomcatTest/hello"; /**
* 测试发送GET请求
*/
public void get() {
// 1. 创建一个默认的client实例
CloseableHttpClient client = HttpClients.createDefault(); try {
// 2. 创建一个httpget对象
HttpGet httpGet = new HttpGet(REQUEST_URL);
System.out.println("executing GET request " + httpGet.getURI()); // 3. 执行GET请求并获取响应对象
CloseableHttpResponse resp = client.execute(httpGet); try {
// 4. 获取响应体
HttpEntity entity = resp.getEntity();
System.out.println("------"); // 5. 打印响应状态
System.out.println(resp.getStatusLine()); // 6. 打印响应长度和响应内容
if (null != entity) {
System.out.println("Response content length = " + entity.getContentLength());
System.out.println("Response content is:\n" + EntityUtils.toString(entity));
} System.out.println("------");
} finally {
// 7. 无论请求成功与否都要关闭resp
resp.close();
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 8. 最终要关闭连接,释放资源
try {
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
} /**
* 测试发送POST请求
*/
public void post() {
// 1. 获取默认的client实例
CloseableHttpClient client = HttpClients.createDefault();
// 2. 创建httppost实例
HttpPost httpPost = new HttpPost(REQUEST_URL);
// 3. 创建参数队列(键值对列表)
List<NameValuePair> paramPairs = new ArrayList<NameValuePair>();
paramPairs.add(new BasicNameValuePair("username", "admin"));
paramPairs.add(new BasicNameValuePair("password", "123456")); UrlEncodedFormEntity entity; try {
// 4. 将参数设置到entity对象中
entity = new UrlEncodedFormEntity(paramPairs, "UTF-8"); // 5. 将entity对象设置到httppost对象中
httpPost.setEntity(entity); System.out.println("executing POST request " + httpPost.getURI()); // 6. 发送请求并回去响应
CloseableHttpResponse resp = client.execute(httpPost); try {
// 7. 获取响应entity
HttpEntity respEntity = resp.getEntity(); // 8. 打印出响应内容
if (null != respEntity) {
System.out.println("------");
System.out.println(resp.getStatusLine());
System.out.println("Response content is : \n" + EntityUtils.toString(respEntity, "UTF-8")); System.out.println("------");
}
} finally {
// 9. 关闭响应对象
resp.close();
} } catch (ClientProtocolException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 10. 关闭连接,释放资源
try {
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
} public static void main(String[] args) {
HttpClientTest test = new HttpClientTest();
// 测试GET请求
test.get();
// 测试POST请求
test.post();
}
}

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

随机推荐

  1. C++函数指针和类成员函数指针

    一.函数指针——基本形式 char Fun(int n) { return char(n); } //char(*pFun)(int); void main() { char(*pFun)(int); ...

  2. Time Limit Exceeded 求逆序对数。

    /** 题目:Time Limit Exceeded 链接:https://oj.ejq.me/problem/28 题意:求逆序对数. 思路:树状数组求逆序对数.维护前面有多少个<=当前数的数 ...

  3. 开源码应用之Eclipse篇

    开写这篇的时候,恰逢Eclpse Mars(4.5)正式公布,最终由日蚀变登火星了,也离我開始基于Eclipse开发产品已经过去10年,这10年间,经历了Eclipse由私有核心框架到拥抱OSGi, ...

  4. Java中常见数据结构

    1:集合 Collection(单列集合) List(有序,可重复) ArrayList 底层数据结构是数组,查询快,增删慢 线程不安全,效率高 Vector 底层数据结构是数组,查询快,增删慢 线程 ...

  5. 图谱论(Spectral Graph Theory)基础

    拉普拉斯矩阵(Laplacian matrix),也称为导纳矩阵(Admittance matrix)或者基尔霍夫矩阵(Kirchohoff matrix) 归一化的拉普拉斯矩阵定义为 例子: 拉普拉 ...

  6. Chromium中多线程及并发技术要点(C/C++)

    类别 类 说明 演示样例 线程机制 Thread (參考:线程模型及应用指南)   MessagePump   MessageQueue   SequencedWorkerPool 它是一个线程池,用 ...

  7. WPF TextBox 验证输入

    //验证输入为数字private void txt_time_KeyDown(object sender, KeyEventArgs e){ if (!((e.Key >= Key.D0 &am ...

  8. c++中sin,cos,arcsin等和在C/C++中使用pi (π) 值

    先 #include<math.h> 反3角函数有 acos(double),asin(double),atan(double),atan(double,double),返回值 doubl ...

  9. 安装使用yarn,使用国内镜像加速npm和yarn

    安装yarn https://yarnpkg.com/lang/zh-hans/docs/install/ 使用国内镜像加速npm和yarn 1. npm config set registry=ht ...

  10. VIM快速使用

    1.VIM键盘图[转] 2.vi复制多行文本的方法 2.1 方法1:光标放到第6行, 输入:2yy 光标放到第9行, 输入:p 此方法适合复制少量行文本的情况,复制第6行(包括)下面的2行数据,放到第 ...