Java使用okhttp发送get、post请求

一、添加依赖

'

复制代码
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.4.1</version>
</dependency>

二、封装请求工具类

复制代码
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
 
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.TimeUnit;
 
@Slf4j
@SuppressWarnings("all")
public class OkHttpUtils {
 
    /**
     * 发送get请求
     *
     * @param url
     * @param params
     * @param tClass
     * @return <T>
     */
    public static <T> T getRequest(String url, Map<String, Object> params, Class<T> tClass) {
        return getRequest(url, null, params, tClass);
    }
 
    /**
     * 发送get请求
     *
     * @param url
     * @param params
     * @param tClass
     * @return <T>
     */
    public static <T> T getRequest(String url, Map<String, Object> headers, Map<String, Object> params, Class<T> tClass) {
        // 超时时间为60s
        OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(3, TimeUnit.MINUTES)
                .readTimeout(3, TimeUnit.MINUTES)
                .writeTimeout(3, TimeUnit.MINUTES)
                // 设置空闲连接数为0个,每个空闲连接的存活时间为1纳秒
                .connectionPool(new ConnectionPool(0, 1, TimeUnit.NANOSECONDS))
                .protocols(Arrays.asList(Protocol.HTTP_1_1))
                .build();
        HttpUrl.Builder httpBuilder = HttpUrl.parse(url).newBuilder();
        if (params != null) {
            params.forEach((k, v) -> {
                if (v != null) {
                    httpBuilder.addQueryParameter(k, String.valueOf(v));
                }
            });
        }
        Request.Builder requestBuilder = new Request.Builder();
        if (headers != null) {
            headers.forEach((k, v) -> requestBuilder.addHeader(k, String.valueOf(v)));
        }
        Request request = requestBuilder
                .url(httpBuilder.build())
                .get()
                .addHeader("Content-Type", "application/x-www-form-urlencoded")
                .build();
        try {
            Response response = client.newCall(request).execute();
            String string = response.body().string();
            log.info("响应结果:" + string);
            if (response.code() == 504) {
                throw new IOException("请求超时,请您稍后重试!");
            }
            return JSON.parseObject(string, tClass);
        } catch (IOException e) {
            log.error(e.getMessage(), e);
            if (e.getMessage().contains("timeout"))
                throw new RuntimeException("请求超时,请您稍后重试!");
            else throw new RuntimeException(e.getMessage());
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw new RuntimeException("系统错误,请您联系客服!");
        }
    }
 
    /**
     * 发送post请求,参数为json格式
     *
     * @param url
     * @param jsonStr
     * @param tClass
     * @return <T>
     */
    public static <T> T postRequest(String url, String jsonStr, Class<T> tClass) {
        return postRequest(url, null, jsonStr, tClass);
    }
 
    /**
     * 发送post请求,参数为json格式
     *
     * @param url
     * @param headers
     * @param jsonStr
     * @param tClass
     * @return <T>
     */
    public static <T> T postRequest(String url, Map<String, Object> headers, String jsonStr, Class<T> tClass) {
        OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(3, TimeUnit.MINUTES)
                .readTimeout(3, TimeUnit.MINUTES)
                .writeTimeout(3, TimeUnit.MINUTES)
                // 设置空闲连接数为0个,每个空闲连接的存活时间为1纳秒
                .connectionPool(new ConnectionPool(0, 1, TimeUnit.NANOSECONDS))
                .protocols(Arrays.asList(Protocol.HTTP_1_1))
                .build();
        MediaType type = MediaType.parse("application/json;charset=utf-8");
        if (jsonStr == null || "".equals(jsonStr)) {
            jsonStr = "{}";
        }
        RequestBody requestBody = RequestBody.create(type, jsonStr);
        Request.Builder requestBuilder = new Request.Builder();
        if (headers != null) {
            headers.forEach((k, v) -> requestBuilder.addHeader(k, String.valueOf(v)));
        }
        Request request = requestBuilder
                .url(url)
                .post(requestBody)
                .addHeader("Content-Type", "application/json;charset=utf-8")
                .build();
        try {
            Response response = client.newCall(request).execute();
            String string = response.body().string();
            log.info("响应结果:" + string);
            if (response.code() == 504) {
                throw new IOException("请求超时,请您稍后重试!");
            }
            return JSON.parseObject(string, tClass);
        } catch (IOException e) {
            log.error(e.getMessage(), e);
            if (e.getMessage().contains("timeout"))
                throw new RuntimeException("请求超时,请您稍后重试!");
            else throw new RuntimeException(e.getMessage());
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw new RuntimeException("系统错误,请您联系客服!");
        }
    }
 
    /**
     * 发送post请求,参数为json格式
     *
     * @param url
     * @param params
     * @param tClass
     * @return <T>
     */
    public static <T> T postRequest(String url, Map<String, Object> params, Class<T> tClass) {
        return postRequest(url, null, params, tClass);
    }
 
    /**
     * 发送post请求,参数为json格式
     *
     * @param url
     * @param headers
     * @param params
     * @param tClass
     * @return <T>
     */
    public static <T> T postRequest(String url, Map<String, Object> headers, Map<String, Object> params, Class<T> tClass) {
        OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(3, TimeUnit.MINUTES)
                .readTimeout(3, TimeUnit.MINUTES)
                .writeTimeout(3, TimeUnit.MINUTES)
                // 设置空闲连接数为0个,每个空闲连接的存活时间为1纳秒
                .connectionPool(new ConnectionPool(0, 1, TimeUnit.NANOSECONDS))
                .protocols(Arrays.asList(Protocol.HTTP_1_1))
                .build();
        MediaType type = MediaType.parse("application/json;charset=utf-8");
        String jsonStr = "{}";
        if (params != null && !params.isEmpty()) {
            jsonStr = JSON.toJSONString(params);
        }
        RequestBody requestBody = RequestBody.create(type, jsonStr);
        Request.Builder requestBuilder = new Request.Builder();
        if (headers != null) {
            headers.forEach((k, v) -> requestBuilder.addHeader(k, String.valueOf(v)));
        }
        Request request = requestBuilder
                .url(url)
                .post(requestBody)
                .addHeader("Content-Type", "application/json;charset=utf-8")
                .build();
        try {
            Response response = client.newCall(request).execute();
            String string = response.body().string();
            log.info("响应结果:" + string);
            if (response.code() == 504) {
                throw new IOException("请求超时,请您稍后重试!");
            }
            return JSON.parseObject(string, tClass);
        } catch (IOException e) {
            log.error(e.getMessage(), e);
            if (e.getMessage().contains("timeout"))
                throw new RuntimeException("请求超时,请您稍后重试!");
            else throw new RuntimeException(e.getMessage());
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw new RuntimeException("系统错误,请您联系客服!");
        }
    }
 
    /**
     * 发送post请求,参数为form格式
     *
     * @param url
     * @param params
     * @param tClass
     * @return <T>
     */
    public static <T> T postFormRequest(String url, Map<String, Object> params, Class<T> tClass) {
        return postFormRequest(url, null, params, tClass);
    }
 
    /**
     * 发送post请求,参数为form格式
     *
     * @param url
     * @param headers
     * @param params
     * @param tClass
     * @return <T>
     */
    public static <T> T postFormRequest(String url, Map<String, Object> headers, Map<String, Object> params, Class<T> tClass) {
        OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(3, TimeUnit.MINUTES)
                .readTimeout(3, TimeUnit.MINUTES)
                .writeTimeout(3, TimeUnit.MINUTES)
                // 设置空闲连接数为0个,每个空闲连接的存活时间为1纳秒
                .connectionPool(new ConnectionPool(0, 1, TimeUnit.NANOSECONDS))
                .protocols(Arrays.asList(Protocol.HTTP_1_1))
                .build();
        // 创建表单体
        FormBody.Builder formBodyBuilder = new FormBody.Builder();
        // 添加表单数据
        if (params != null) {
            params.forEach((k, v) -> {
                if (v != null) {
                    String newVal = "";
                    if (v instanceof String) {
                        newVal = (String) v;
                    } else {
                        newVal = JSON.toJSONString(v);
                    }
                    formBodyBuilder.add(k, newVal);
                }
            });
        }
        FormBody formBody = formBodyBuilder.build();
        Request.Builder requestBuilder = new Request.Builder();
        if (headers != null) {
            headers.forEach((k, v) -> requestBuilder.addHeader(k, String.valueOf(v)));
        }
        Request request = requestBuilder
                .url(url)
                .post(formBody)
                .build();
        try {
            Response response = client.newCall(request).execute();
            String string = response.body().string();
            log.info("响应结果:" + string);
            if (response.code() == 504) {
                throw new IOException("请求超时,请您稍后重试!");
            }
            return JSON.parseObject(string, tClass);
        } catch (IOException e) {
            log.error(e.getMessage(), e);
            if (e.getMessage().contains("timeout"))
                throw new RuntimeException("请求超时,请您稍后重试!");
            else throw new RuntimeException(e.getMessage());
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw new RuntimeException("系统错误,请您联系客服!");
        }
    }
 
}
相关推荐
IvorySQL1 小时前
PG 日报|新增 VACUUM 全维度统计信息补丁迭代
数据库·人工智能·postgresql·ivorysql
不能跑的代码不是好代码2 小时前
Linux系统常用命令中文速查表
linux·运维·服务器
wuqingshun3141592 小时前
什么是责任链模式,一般用在什么场景?
java·责任链模式
石一峰6992 小时前
深入理解 Linux 中断三层机制与 1-Wire 时序锁原理
linux·运维·服务器
:-)3 小时前
算法-归并排序
java·开发语言·数据结构·算法·排序算法
wuqingshun3141593 小时前
说一下消息队列的模型有哪些?
java
无限码农3 小时前
Linux上通过cmake编译uchardet
linux·运维·服务器
白露与泡影4 小时前
Redis 缓存实战:雪崩、穿透、击穿一次讲透
数据库·redis·缓存
fīɡЙtīиɡ ℡4 小时前
布隆过滤器
java
yaoxin5211234 小时前
462. Java 反射 - 获取声明类与封闭类
java·开发语言·python