【HttpClient】快速上手HttpClient

参考:B站动力节点

HttpClient介绍

HttpClient是一个HTTP通信库、一个工具包,它只提供一个通用浏览器应用程序所期望的功能子集,与浏览器相比是没有界面的。
它的特点是基于标准、纯净的java语言。实现了HTTP1.0和HTTP1.1;以可扩展的面向对象的结构实现了HTTP全部的方法(GET, POST等7种方法);支持HTTPS协议;通过HTTP代理建立透明的连接。
简而言之,利用HttpClient工具包,我们可以在Java程序中调用第三方接口

官方文档:http://hc.apache.org/httpcomponents-client-5.0.x/

依赖

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

前置知识

HTTP协议规定了请求和回复的格式:

  • 起始行 (start line)
  • 头信息 (headers)
  • 主体(entity body)
  1. HTTP请求:

    • 首行:包括方法、URL和HTTP版本。例如,GET /index.html HTTP/1.1。
    • 请求报头(header):包含各种键值对,如Host、Content-Length和Content-Type、User-Agent、Referer、Cookie等。
    • 请求正文(body):如果请求方法支持正文(如POST),则正文包含发送的数据。正文的数据格式可以是application/x-www-form-urlencoded、application/json或multipart/form-data等。
  2. HTTP响应:

    • 首行:包括状态码、原因短语和HTTP版本。例如,HTTP/1.1 200 OK。
    • 响应报头(header):与请求报头类似,包含各种键值对。
    • 响应正文(body):包含服务器返回的数据,可以是HTML、JSON、图片等任何类型的数据。

GET请求示例

    @Test
    public void testGET() {
        // 以编程方式,发起GET请求
        String url = "https://restapi.amap.com/v3/ip?key=0113a13c88697dcea6a445584d535837&ip=60.25.188.64";

        // 创建HttpClient对象
        CloseableHttpClient client = HttpClients.createDefault();
        // 创建HttpGET对象
        HttpGet httpGet = new HttpGet(url);
        // 执行请求,使用client对象的方法,返回结果
        // 返回结果是一个response对象,相当于HttpServletResponse
        try {
            CloseableHttpResponse response = client.execute(httpGet);
            // 从response获取响应信息
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                // 获取数据
                // 返回字节流数据 response.getEntity().getContent();
                // 使用EntityUtils转成json字符串
                String json = EntityUtils.toString(response.getEntity());
                System.out.println("访问IP响应结果: " + json);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                client.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
	}       

结果:

访问IP响应结果: {"status":"1","info":"OK","infocode":"10000","province":"天津市","city":"天津市","adcode":"120000","rectangle":"116.9334447,38.91360118;117.4980283,39.34728312"}

这里需要注意的是,CloseableHttpClient实现了Closeable接口,需要使用close()方法,关闭网络连接(底层使用了连接池控制HTTP长连接)。


POST请求示例

    @Test
    public void testPOST() {
        // 创建HttpClient对象
        CloseableHttpClient client = HttpClients.createDefault();

        // 创建Http对象,表示post请求
        String url = "https://restapi.amap.com/v3/ip";
        HttpPost httpPost = new HttpPost(url);

        // 指定请求参数 key-value形式
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("key", "0113a13c88697dcea6a445584d535837"));
        params.add(new BasicNameValuePair("ip", "39.137.95.111"));

        try {
            httpPost.setEntity(new UrlEncodedFormEntity(params));
            // 执行请求
            CloseableHttpResponse response = client.execute(httpPost);
            // 读取数据
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                // 获取数据
                String json = EntityUtils.toString(response.getEntity());
                System.out.println("json: " + json);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                client.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

给Post请求加请求体内容时,使用的是NameValuePair接口列表,内置它的实现类BasicNameValuePair(key, value),最后使用new UrlEncodedFormEntity(params)生成HttpPost成员变量所需要的Entity类。

结果:

json: {"status":"1","info":"OK","infocode":"10000","province":[],"city":[],"adcode":[],"rectangle":[]}

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值