美文网首页
HttpClient入门详解

HttpClient入门详解

作者: 释梦石 | 来源:发表于2019-07-12 17:31 被阅读0次

    HttpClient是客户端的http通信实现库,这个类库的作用是接收和发送http报文,使用这个类库,它相比传统的 HttpURLConnection,增加了易用性和灵活性,我们对于http的操作会变得简单一些;

    一、HttpClient基础之HTTP

    1.1 http协议

    Http协议(Hyper Text Transfer Protocol,超文本传输协议)是TCP/IP协议的一个应用层协议,用于定义WEB浏览器和WEB服务器之间交换数据的过程以及数据本身的格式。HTTP协议的特点:无状态。

    1.2 HTTP协议到底约束了什么

    • 约束了浏览器以何种格式向服务端发送数据

    • 约束了服务器应该以何种格式来接受客户端发送的数据

    • 约束了服务器应该一何种格式来反馈数据给浏览器

    • 约束了浏览器以何种格式来接收服务器反馈的数据

    • 浏览器给服务器发送数据:一次请求

    • 服务器给浏览器反馈数据:一次响应

    1.3 HTTP协议版本

    HTTP协议版本包括:HTTP/1.0和HTTP/1.1以及HTTP-NG

    1.4 HTTP请求消息和响应信息的结构

    • HTTP请求消息包括:一个请求行,若干请求头,以及实体内容,其中一些请求头和实体内容是可选的。

    • HTTP响应消息包括:一个状态行,若干响应头,以及实体内容,其中一些消息头和实体内容是可选的。

    常见的响应状态码有

    200:表示OK;

    404:表示请求的资源路径不存在

    500:表示服务器有问题。

    1.5 HTTP常用的请求方式:GET和POST

    开发中主要处理的就是Get和Post请求

    GET请求方式

    GET请求资源包括请求参数:第一个参数使用?和资源连接,其他参数使用&符号连接,GET请求信息限制不超过1KB如:https://www.baidu.com/s?wd=http&rsv_spt=1,GET请求暴露了请求信息。

    POST请求方式

    POST请求行中不再有请求信息,参数全部在请求的实体中;POST隐藏了请求信息,较安全;并且POST方式没有限制请求的数据大小

    服务器于浏览器之间的交互

    二、HttpClient使用介绍

    HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包。HTTP Client和浏览器有点像,都可以用来发送请求,接收服务端响应的数据。但它不是浏览器,没有用户界面。HttpClient是一个HTTP通信库,只通过其API用于传输和接受HTTP消息。

    HttpClient下载

    可在官网直接下载:http://hc.apache.org/downloads.cgi,目前最新版本:4.5.9;(HttpClient3和HttpClient4接口差别比较大,3版本的代码放到4里可能会有报错)若项目为maven项目,可直接添加maven依赖:

    
     <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>4.5.8</version>
            </dependency>
    
    

    三、HttpClient API的常用方法

    HttpClient 支持了在 HTTP / 1.1 规范中定义的所有 HTTP 方法:GET,HEAD,POST,PUT,DELETE,TRACE 和 OPTIONS。对于每个方法类型,都有一个特定的类来支持:HttpGet, HttpHead,HttpPost, HttpPut,HttpDelete, HttpTrace,和 HttpOptions。

    3.1 HttpClient使用步骤

    • 创建HttpClient对象;

    • 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。

    • 如果需要发送请求参数,可调用setEntity(HttpEntity entity)方法来设置请求参数;

    • 调用HttpClient对象的execute()方法来发送请求 释放链接。

    • 获取响应信息

    首先,我们先介绍一下HttpEntity接口,Entity 是 HttpClient 中的一个特别的概念,所有的Entity都实现了HttpEntity 接口,输入是一个 Entity,输出也是一个 Entity 。这和 HttpURLConnection 的流有些不同,但是基本理念是相通的。HttpClient 提供给我们一个工具类 EntityUtils,可以很方便的操作Entity

    3.2 httpclient发送GET请求的例子:

    
     @Test
        public void TestGet() throws IOException {
    
            String urlTest = "https://baike.baidu.com/item/1/31661?fr=aladdin";
            // 1.创建httpclient
            CloseableHttpClient httpclient = HttpClients.createDefault();
            //2. 创建HttpGet
            HttpGet httpGetTest1 = new HttpGet(urlTest);
            // 3. 请求执行,获取响应
            CloseableHttpResponse response =  httpclient.execute(httpGetTest1);
            System.out.println(response);
            // 4.获取响应实体
            HttpEntity entityTest = response.getEntity();
            System.out.println(EntityUtils.toString(entityTest,"utf-8"));
            response.close();
            httpclient.close();
    
        }
    
    

    GET请求的参数传递是通过URL拼接来实现的,所以,我们想发送带参数的get请求,可直接拼接在ulr后:

    
    //设置带参数的URL
    HttpGet httpget = new HttpGet("http://www.google.com/search?hl=en&q=httpclient&btnG=Google+Search&aq=f&oq=");
    
    

    HtttpClient给我们提供一个URIBuilder 工具类,使创建和修改uri请求变得简单

    
    @Test
        public void Test1(){
            URI uri = null;
            try {
                uri = new URIBuilder()
                        .setScheme("http")
                        .setHost("www.google.com")
                        .setPath("/search")
                        .setParameter("q", "httpclient")
                        .setParameter("btnG", "Google Search")
                        .setParameter("aq", "f")
                        .setParameter("oq", "")
                        .build();
            } catch (URISyntaxException e) {
                e.printStackTrace();
            }
            HttpGet httpget = new HttpGet(uri);
            System.out.println(httpget.getURI());
        }
    
    

    输入结果:

    
    http://www.google.com/search?q=httpclient&btnG=Google+Search&aq=f&oq=
    
    

    3.3 httpclient发送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;
        }
    }
    
    

    四、并发的场景下使用HttpClient

    • 因为发请求耗时,特别是客户端,为了不阻塞主线程(也就是用户操作的ui线程),都要把网络请求放在子线程中进行。
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();
        thread1.start();
        thread2.start();   
        class MyThread extends Thread{
                @Override
                public void run() {
                    //发送get和post请求的地方
                    get...
                }
        }
    

    相关文章

      网友评论

          本文标题:HttpClient入门详解

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