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("系统错误,请您联系客服!");
        }
    }
 
}
相关推荐
程序员z71 分钟前
深入理解 GMP 模型:Go 协程调度器的设计与调度场景全解析
服务器·网络·golang
AI人工智能+电脑小能手2 分钟前
大白话说Java设计模式-34-命令模式(业务实战篇)
java·spring·设计模式·命令模式·异步任务·撤销重做·事务封装
净重21克4 分钟前
万字长文!TLS协议升级避坑手册:JDK老项目适配TLS1.2/1.3全流程拆解
java·springboot·java安全
滨哥GPT5 分钟前
Codex修改数据库后项目启动失败怎么办?Migration、Schema与数据结构排查
数据库·ai编程·开发工具·schema·codex
一直C7 分钟前
【数据结构】哈希表+算法复杂度与经典排序查找(C语言)
java·linux·开发语言·数据结构·算法·ubuntu·散列表
paopaokaka_luck7 分钟前
基于springboot3+vue3的车间生产管理系统(Echarts图形化分析、BI报表)
java·前端·spring boot·学习·echarts
戴西软件15 分钟前
国内有哪些数据轻量化格式转换软件?
数据库·算法·安全·信息可视化·自动化·rpa
λqaq71 小时前
MySQL 数据库基础(2)约束、用户权限、远程连接、外键与 TCP/UDP 理解
linux·数据库·python·tcp/ip·mysql
丰锋ff1 小时前
基于C++11的数据库连接池
数据库
Zane19941 小时前
遍历时删元素为什么报错:modCount 这个"计数器"在背后盯着你
java·后端