CloseableHttpClient的Get/Post基本使用与小坑

前言:是什么?

当用习惯了Spring自带得RestTemplate,就很少用HttpClient接口的方式了,其实CloseableHttpClient也是http网络请求的一种工具包,实现了HttpClient接口,可以让我们方便的设置请求参数和请求头信息,还能让我们决定连接超时时间和socket超时时间,同时它会自己维护一个连接池,可以做连接数限制(默认5)和过期回收策略,防止每次请求都要创建新的connect,非常的方便。

(1)准备工作

依赖:

Gradle:
implementation 'org.apache.httpcomponents:httpmime:4.5.10'

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

自己写个服务,启动两个接口,分别对应Get方式和Post方式
CloseableHttpClient的Get/Post基本使用与小坑_第1张图片

(2)CloseableHttpClient的用法:

Main方法进行调用:

public static void main(String[] args) {
    CloseAbleHttpClient client = new CloseAbleHttpClient();
    client.httpTemplate();
}

(3)Get请求方式:

public class CloseAbleHttpClient {

    public void httpTemplate(){
        CloseableHttpClient httpclient = HttpClients.createDefault();

	// 设置请求的URL路径
        URIBuilder urlBuilder = new URIBuilder()
                .setScheme("http")
                .setHost("localhost:8080")
                .setPath("/test/get");
        // 设置请求的连接超时时间
        RequestConfig requestConfig = RequestConfig.custom()
                .setSocketTimeout(1000)
                .setConnectTimeout(1000)
                .build();

        try {
            URI url = urlBuilder.build();
            // 无参数GET请求方式
            HttpGet httpGet = new HttpGet(url);
            httpGet.setConfig(requestConfig);
            httpGet.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
// 获取返回值
            CloseableHttpResponse apiRes = httpclient.execute(httpGet);
            HttpEntity entity = apiRes.getEntity();
            String content = EntityUtils.toString(entity);
            System.out.println("接收到了返回信息:"+content);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

执行查看结果:
在这里插入图片描述

带参数的Get请求方式:

改造一下服务端的接口,变成restful风格那样子,使得接口接到get请求的msg参数后拼在后面返回
CloseableHttpClient的Get/Post基本使用与小坑_第2张图片
改造一下请求方式,get的URL后面加上参数
CloseableHttpClient的Get/Post基本使用与小坑_第3张图片
请求结果:
在这里插入图片描述

(4)Post请求方式:

这里针对服务端的Post接口也做一些变动,使得它要求一个User的POJO入参,返回String

CloseableHttpClient的Get/Post基本使用与小坑_第4张图片
CloseableHttpClient的Get/Post基本使用与小坑_第5张图片
Post方法body携带的参数部分我用了最简单的StringEntity带过去,更多可以用BasicNameValuePair,这一个键值对的参数设置方式在另外一篇博客有详细介绍哈~

public class CloseAbleHttpClient {

    public void httpTemplate(){
        CloseableHttpClient httpclient = HttpClients.createDefault();

        URIBuilder urlBuilder = new URIBuilder()
                .setScheme("http")
                .setHost("localhost:8080")
                .setPath("/test/post");

        RequestConfig requestConfig = RequestConfig.custom()
                .setSocketTimeout(1000)
                .setConnectTimeout(1000)
                .build();

        try {
            URI url = urlBuilder.build();
//             POST
            HttpPost httpPost = new HttpPost(url);
            httpPost.setConfig(requestConfig);
            String body = "{\"age\": \"19\",\"name\": \"jojo\",\"sex\": \"M\"}";
            StringEntity stringEntity = new StringEntity(body, "utf-8");
            httpPost.setEntity(stringEntity);
            httpPost.addHeader("Content-Type","application/json;charset=utf-8");
            CloseableHttpResponse apiRes = httpclient.execute(httpPost);

            HttpEntity entity = apiRes.getEntity();
            String content = EntityUtils.toString(entity);
            System.out.println("接收到了返回信息:"+content);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

发现传过去和返回来的都是空的,这是什么回事呢?
在这里插入图片描述
一定要加Get,Set方法!
CloseableHttpClient的Get/Post基本使用与小坑_第6张图片
在这里插入图片描述
不管是直接传pojo还是String再转Object,都一定记得加Get,Set,因为底层都是调用反射拿到SetMethod去执行设值操作的。
在这里插入图片描述
在这里插入图片描述
同时注意,charset这个utf-8编码格式,非常重要!不然双引号和逗号都会变成:%7B%22这类鬼东西
在这里插入图片描述

当我们服务端打开Debug模式没放开,SocketTimeOut和ConnectTimeOut 设置的1000ms也就是1秒,就会超时,报异常

CloseableHttpClient的Get/Post基本使用与小坑_第7张图片

以上就是一些常用的基本用法总结,稍后有补充~

你可能感兴趣的:(Java实战项目分享,Java基础系列,开发的小坑小洼)