HttpClient基本使用

Posted 64byte

tags:

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

通俗的讲httpClient就是 模拟浏览器向某个网址发送各种请求

功能:

  1. 实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
  2. 支持自动转向
  3. 支持 HTTPS 协议
  4. 支持代理服务器等

使用方法

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

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

需要导入的依赖:

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.5</version>
</dependency>

HTTPClient的使用

1、发送Get请求,无参

public void test() {
        //1、得到httpClient的客户端,相当于打开了一个浏览器窗口
        CloseableHttpClient httpclient = HttpClientBuilder.create().build();
        //2、创建一个get请求,相当于你在浏览器窗口输入了一个网址
        HttpGet httpGet = new HttpGet("http://www.baidu.com");
        //3、创建一个相应模型的对象,用于接收服务器响应的数据
        CloseableHttpResponse httpResponse = null;
        try {
            //4、发送请求,相当于你敲了一下回车
            httpResponse = httpclient.execute(httpGet);
            //5、获取http状态
            System.out.println("状态:" +httpResponse.getStatusLine());
            //6、从响应模型获取响应体
            HttpEntity entity = httpResponse.getEntity();
            
            if(entity != null) {
                System.out.println("响应长度"+entity.getContentLength());
                System.out.println("响应数据"+EntityUtils.toString(entity,"UTF-8"));
            }    
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //倒序关闭资源
            try {
                if(httpResponse != null) {
                    httpResponse.close();
                }
                if(httpclient != null) {
                    httpclient.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

2、发送Get请求, 带参数

技术图片
public void testdoGetRequest2() {
        // 1.得到HttpClient的客户端,相当于你打开了一个浏览器窗口
        CloseableHttpClient httpClient = HttpClientBuilder.create().build();

        // 参数
        StringBuffer params = new StringBuffer();
        try {
            // 字符数据最好进行url编码;这样一来,某些特殊字符才能传过去(如:参数就是“&”,不url编码,传不过去)
            params.append("wd=" + URLEncoder.encode("张三丰", "utf-8"));
            params.append("&");
            params.append("rsv_spt=1");
        } catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();
        }
        // 2.创建一个get请求, 相当于你在浏览器窗口输入了一个网址
        HttpGet httpGet = new HttpGet("http://www.baidu.com/s?"+params.toString());
        // 3.创建一个响应模型对象,用于接收服务器响应的数据
        CloseableHttpResponse httpResponse = null;
        try {
            // 4.发送请求, 相当于你敲了一下回车
            httpResponse = httpClient.execute(httpGet);
            // 5.获取Http状态
            System.out.println("状态:" + httpResponse.getStatusLine());
            // 6.从响应模型获取响应实体
            HttpEntity entity = httpResponse.getEntity();
            if (entity != null) {
                System.out.println("响应长度:" + entity.getContentLength());
                System.out.println("响应数据:" + EntityUtils.toString(entity, "UTF-8"));
            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                if (httpResponse != null) {
                    httpResponse.close();
                }
                if (httpClient != null) {
                    httpClient.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
View Code

3、发送Get请求, 使用uri关键访问的路径

public void testdoGetRequest3() {
        // 1.得到HttpClient的客户端,相当于你打开了一个浏览器窗口
        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
        // 构建uri
        URI uri = null;
        try {
            //将参数放入键值对类NameValuePair中,再放入集合中
            List<NameValuePair> params = new ArrayList<>();
            params.add(new BasicNameValuePair("wd", "java"));
            params.add(new BasicNameValuePair("rsv_bp", "1"));
            // 设置uri信息,并将参数集合放入uri;
            // 注:这里也支持一个键值对一个键值对地往里面放setParameter(String key, String value)
            uri = new URIBuilder().setScheme("http").setHost("www.baidu.com").setPort(80).setPath("/s")
                    .setParameters(params).build();
        } catch (URISyntaxException e1) {
            e1.printStackTrace();
        }

        // 2.创建一个get请求, 相当于你在浏览器窗口输入了一个网址
        HttpGet httpGet = new HttpGet(uri );
        // 3.创建一个响应模型对象,用于接收服务器响应的数据
        CloseableHttpResponse httpResponse = null;
        try {
            // 4.发送请求, 相当于你敲了一下回车
            httpResponse = httpClient.execute(httpGet);
            // 5.获取Http状态
            System.out.println("状态:" + httpResponse.getStatusLine());
            // 6.从响应模型获取响应实体
            HttpEntity entity = httpResponse.getEntity();
            if (entity != null) {
                System.out.println("响应长度:" + entity.getContentLength());
                System.out.println("响应数据:" + EntityUtils.toString(entity, "UTF-8"));
            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                if (httpResponse != null) {
                    httpResponse.close();
                }
                if (httpClient != null) {
                    httpClient.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

4、发送Post请求,无参

技术图片
public void testdoPostRequest1() {
        // 1.得到HttpClient的客户端,相当于你打开了一个浏览器窗口
        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
        // 2.创建一个post请求, 相当于你在浏览器窗口输入了一个网址
        HttpPost httpPost = new HttpPost("http://www.baidu.com");
        // 3.创建一个响应模型对象,用于接收服务器响应的数据
        CloseableHttpResponse httpResponse = null;
        try {
            // 4.发送请求, 相当于你敲了一下回车
            httpResponse = httpClient.execute(httpPost);
            // 5.获取Http状态
            System.out.println("状态:" + httpResponse.getStatusLine());
            // 6.从响应模型获取响应实体
            HttpEntity entity = httpResponse.getEntity();
            if (entity != null) {
                System.out.println("响应长度:" + entity.getContentLength());
                System.out.println("响应数据:" + EntityUtils.toString(entity, "UTF-8"));
            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                if (httpResponse != null) {
                    httpResponse.close();
                }
                if (httpClient != null) {
                    httpClient.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
View Code

5、发送Post请求,带参

public void testdoPostRequest2() {
        // 1.得到HttpClient的客户端,相当于你打开了一个浏览器窗口
        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
        // 2.创建一个post请求, 相当于你在浏览器窗口输入了一个网址
        // 构建uri
        URI uri = null;
        try {
            // 将参数放入键值对类NameValuePair中,再放入集合中
            List<NameValuePair> params = new ArrayList<>();
            params.add(new BasicNameValuePair("Uid", "本站用户名"));
            params.add(new BasicNameValuePair("Key", "接口安全秘钥"));
            params.add(new BasicNameValuePair("smsMob","手机号码"));
            params.add(new BasicNameValuePair("smsText","验证码:8888【XX公司或XX网名称】"));
            // 设置uri信息,并将参数集合放入uri;
            // 注:这里也支持一个键值对一个键值对地往里面放setParameter(String key, String value)
            uri = new URIBuilder().setScheme("http").setHost("utf8.api.smschinese.cn")
                    .setParameters(params).build();
        } catch (URISyntaxException e1) {
            e1.printStackTrace();
        }
        HttpPost httpPost = new HttpPost(uri);
        // 3.创建一个响应模型对象,用于接收服务器响应的数据
        CloseableHttpResponse httpResponse = null;
        try {
            // 4.发送请求, 相当于你敲了一下回车
            httpResponse = httpClient.execute(httpPost);
            // 5.获取Http状态
            System.out.println("状态:" + httpResponse.getStatusLine());
            // 6.从响应模型获取响应实体
            HttpEntity entity = httpResponse.getEntity();
            if (entity != null) {
                System.out.println("响应长度:" + entity.getContentLength());
                System.out.println("响应数据:" + EntityUtils.toString(entity, "UTF-8"));
            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                if (httpResponse != null) {
                    httpResponse.close();
                }
                if (httpClient != null) {
                    httpClient.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

 

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

WP8,怎么使用HttpClient?

android的自带的httpClient 怎么上传文件

Angular 5 HTTPClient 基本授权不起作用

HttpClient 4.2、基本身份验证和 AuthScope

html PHP代码片段: - AJAX基本示例:此代码演示了使用PHP和JavaScript实现的基本AJAX功能。

HttpClient基本使用