HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java net包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
HTTP和浏览器有点像,但却不是浏览器。很多人觉得既然HttpClient是一个HTTP客户端编程工具,很多人把他当做浏览器来理解,但是其实HttpClient不是浏览器,它是一个HTTP通信库,因此它只提供一个通用浏览器应用程序所期望的功能子集,最根本的区别是HttpClient中没有用户界面,浏览器需要一个渲染引擎来显示页面,并解释用户输入,例如鼠标点击显示页面上的某处,有一个布局引擎,计算如何显示HTML页面,包括级联样式表和图像。javascript解释器运行嵌入HTML页面或从HTML页面引用的javascript代码。来自用户界面的事件被传递到javascript解释器进行处理。除此之外,还有用于插件的接口,可以处理Applet,嵌入式媒体对象(如pdf文件,Quicktime电影和Flash动画)或ActiveX控件(可以执行任何操作)。HttpClient只能以编程的方式通过其API用于传输和接受HTTP消息。
结构
模拟GET请求
导入依赖
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.2</version> </dependency>
执编写HttpClient类
public class HttpClient {
public static void main(String[] args) throws IOException {
//GET请求
Get();
}
//模拟GET请求
public static void Get() throws IOException {
//创建连接
CloseableHttpClient client = HttpClients.createDefault();
//创建一个请求
HttpGet httpGet=new HttpGet("https://www.baidu.com/");
//执行请求获取响应的结果
CloseableHttpResponse response = client.execute(httpGet);
//获取响应的状态码
int code = response.getStatusLine().getStatusCode();
System.out.println("服务器返回的状态码:"+code);
//服务器正常响应
if (code==200){
//获取响应结果
String s = EntityUtils.toString(response.getEntity(), "UTF-8");
System.out.println(s);
}
//关闭连接
response.close();
client.close();
}
}
执行的结果
模拟POST请求
接收post请求类
相当于服务器,结构如下:
导入依赖
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
编写Httpservlet类
@WebServlet("/httpServlet") public class HttpServlet extends javax.servlet.http.HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username"); System.out.println("信息:"+username); resp.setContentType("text/html;charset=utf-8"); resp.getWriter().write("服务器接收数据!"); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } }
编写HttpClient类
public class HttpClient { public static void main(String[] args) throws IOException { //post请求 Post(); }//模拟post请求 public static void Post() throws IOException { //创建连接 CloseableHttpClient client = HttpClients.createDefault(); //创建请求 HttpPost httpPost=new HttpPost("http://localhost:8083/httpServlet"); //创建参数队列 List<NameValuePair> pairList=new ArrayList<>(); pairList.add(new BasicNameValuePair("username","wn")); //创建请求体,封装数据 UrlEncodedFormEntity entity=new UrlEncodedFormEntity(pairList,"UTF-8"); //将请求体发送给当前请求 httpPost.setEntity(entity); //发送请求,接收结果 CloseableHttpResponse response=client.execute(httpPost); String s = EntityUtils.toString(response.getEntity(), "UTF-8"); System.out.println(s); //关闭资源 response.close(); client.close(); } }
执行结果
httpClient项目结果:
servlet项目结果: