美文网首页
模块间通信HttpClient

模块间通信HttpClient

作者: isuntong | 来源:发表于2020-01-21 13:15 被阅读0次

    sayHi(String... str) 可以实现可变参数,但是可变参数只能是参数的最后一个

    ui门户模块 想请求到 api 模块的数据,每个模块一个服务器,就有了模块间的通讯问题

    Apache HttpClient

    简易架构图

    Apache HttpClient 简介

    HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient。

    (HTMLUnit是解析器,多用来爬虫,拿页面上的元素;
    Jsoup更好用一些,java爬虫多用这个。Java做爬虫工作量大,开发周期长,python开箱即用;
    Java爬虫执行效率是python的10倍以上。)

    HttpClient 相比传统 JDK 自带的 URLConnection,增加了易用性和灵活性,它不仅是客户端发送 HTTP 请求变得容易,而且也方便了开发人员测试接口(基于 HTTP 协议的),即提高了开发的效率,也方便提高代码的健壮性。因此熟练掌握 HttpClient 是很重要的必修内容,掌握 HttpClient 后,相信对于 HTTP 协议的了解会更加深入。

    Apache HttpClient 特性

    • 基于标准、纯净的 Java 语言。实现了 HTTP 1.0 和 HTTP 1.1
    • 以可扩展的面向对象的结构实现了 HTTP 全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。
    • 支持 HTTPS 协议。
    • 通过 HTTP 代理建立透明的连接。
    • 利用 CONNECT 方法通过 HTTP 代理建立隧道的 HTTPS 连接。
    • Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos 认证方案。
    • 插件式的自定义认证方案。
    • 便携可靠的套接字工厂使它更容易的使用第三方解决方案。
    • 连接管理器支持多线程应用。支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接。
    • 自动处理 Set-Cookie 中的 Cookie。
    • 插件式的自定义 Cookie 策略。
    • Request 的输出流可以避免流中内容直接缓冲到 Socket 服务器。
    • Response 的输入流可以有效的从 Socket 服务器直接读取相应内容。
    • 在 HTTP 1.0 和 HTTP 1.1 中利用 KeepAlive 保持持久连接。
    • 直接获取服务器发送的 response code 和 headers。
    • 设置连接超时的能力。
    • 实验性的支持 HTTP 1.1 response caching。
    • 源代码基于 Apache License 可免费获取。

    Apache HttpClient 使用流程

    使用 HttpClient 发送请求、接收响应很简单,一般需要如下几步即可。

    • 创建 HttpClient 对象。
    • 创建请求方法的实例,并指定请求 URL。如果需要发送 GET 请求,创建 HttpGet 对象;如果需要发送 POST 请求,创建 HttpPost 对象。
    • 如果需要发送请求参数,可调用 HttpGetHttpPost 共同的 setParams(HttpParams params) 方法来添加请求参数;对于 HttpPost 对象而言,也可调用 setEntity(HttpEntity entity) 方法来设置请求参数。
    • 调用 HttpClient 对象的 execute(HttpUriRequest request) 发送请求,该方法返回一个 HttpResponse
    • 调用 HttpResponsegetAllHeaders()getHeaders(String name) 等方法可获取服务器的响应头;调用 HttpResponsegetEntity() 方法可获取 HttpEntity 对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
    • 释放连接。无论执行方法是否成功,都必须释放连接

    Apache HttpClient 使用实例

    POM
    <!-- Apache Http Begin -->
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>fluent-hc</artifactId>
        <version>4.5.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpmime</artifactId>
        <version>4.5.5</version>
    </dependency>
    <!-- Apache Http End -->
    

    主要增加了 org.apache.httpcomponents:httpclientorg.apache.httpcomponents:fluent-hcorg.apache.httpcomponents:httpmime 三个依赖

    创建 HttpGet 请求
    package com.suntong.hello.httpclient;
    
    import org.apache.http.HttpEntity;
    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.HttpClients;
    import org.apache.http.util.EntityUtils;
    
    import java.io.IOException;
    
    public class HelloHttpClientTest {
        public static void main(String[] args) {
            //创建HttpClient客户端,打开浏览器
            CloseableHttpClient httpClient = HttpClients.createDefault();
    
            //创建 GET 请求,输入 URL
            HttpGet httpGet = new HttpGet("http://localhost:8080/content/page?draw=1&start=0&length=10");
    
            //发送请求,回车
            try {
                CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
                HttpEntity httpEntity = httpResponse.getEntity();
                System.out.println(EntityUtils.toString(httpEntity));
            } catch (IOException e) {
                e.printStackTrace();
            }
    
    
        }
    }
    
    

    直接代码访问会被拦截

    登陆时带着cookie就行

    增加代码

    //创建 GET 请求,输入 URL
            HttpGet httpGet = new HttpGet("http://localhost:8080/content/page?draw=1&start=0&length=10");
            httpGet.setHeader("Cookie", "JSESSIONID=D20026CAB3D6C309299BC2850AC25174");
    

    请求成功

    完整代码

    package com.suntong.hello.httpclient;
    
    import org.apache.http.HttpEntity;
    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.HttpClients;
    import org.apache.http.util.EntityUtils;
    
    import java.io.IOException;
    
    public class HelloHttpClientTest {
        public static void main(String[] args) {
            //创建HttpClient客户端,打开浏览器
            CloseableHttpClient httpClient = HttpClients.createDefault();
    
            //创建 GET 请求,输入 URL
            HttpGet httpGet = new HttpGet("http://localhost:8080/content/page?draw=1&start=0&length=10");
    
            //长连接,sessionID,用户代理(什么浏览器)
            httpGet.setHeader("Connection","keep-alive");
            httpGet.setHeader("Cookie", "JSESSIONID=D20026CAB3D6C309299BC2850AC25174");
            httpGet.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36");
    
            //发送请求,回车
            try {
                CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
                HttpEntity httpEntity = httpResponse.getEntity();
                System.out.println(EntityUtils.toString(httpEntity));
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                try {
                    if(httpClient != null){
                        httpClient.close(); 
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
    
        }
    }
    
    

    post请求

    package com.suntong.hello.httpclient;
    
    import org.apache.http.HttpEntity;
    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.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;
    
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.util.ArrayList;
    import java.util.List;
    
    public class MyTest {
        public static void main(String[] args) {
            post();
        }
    
        private static void post() {
            // 创建 HttpClient 客户端
            CloseableHttpClient httpClient = HttpClients.createDefault();
    
            // 创建 HttpPost 请求
            HttpPost httpPost = new HttpPost("http://localhost:8080/content/page");
            // 设置长连接
            httpPost.setHeader("Connection", "keep-alive");
            // 设置代理(模拟浏览器版本)
            httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36");
            // 设置 Cookie
            httpPost.setHeader("Cookie", "JSESSIONID=D20026CAB3D6C309299BC2850AC25174");
    
            // 创建 HttpPost 参数
            List<BasicNameValuePair> params = new ArrayList<BasicNameValuePair>();
            params.add(new BasicNameValuePair("draw", "1"));
            params.add(new BasicNameValuePair("start", "0"));
            params.add(new BasicNameValuePair("length", "10"));
    
            CloseableHttpResponse httpResponse = null;
            try {
                // 设置 HttpPost 参数
                httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
                httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                // 输出请求结果
                System.out.println(EntityUtils.toString(httpEntity));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            // 无论如何必须关闭连接
            finally {
                try {
                    if (httpResponse != null) {
                        httpResponse.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
    
                try {
                    if (httpClient != null) {
                        httpClient.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:模块间通信HttpClient

          本文链接:https://www.haomeiwen.com/subject/ppfezctx.html