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("系统错误,请您联系客服!");
        }
    }
 
}
相关推荐
何仙鸟26 分钟前
GarmageSet下载和处理
java·开发语言
wefly201731 分钟前
免安装!m3u8live.cn在线 M3U8 播放器,小白也能快速上手
java·开发语言·python·json·php·m3u8·m3u8在线转换
yuweiade33 分钟前
springboot和springframework版本依赖关系
java·spring boot·后端
ywf121534 分钟前
springboot设置多环境配置文件
java·spring boot·后端
2401_8735449238 分钟前
使用Python进行PDF文件的处理与操作
jvm·数据库·python
小马爱打代码1 小时前
SpringBoot + 消息生产链路追踪 + 耗时分析:从创建到发送,全链路性能可视化
java·spring boot·后端
虾..1 小时前
多路复用 --- select系统调用
服务器·数据库·sql
杨云龙UP1 小时前
mysqldump逻辑备份文件恢复总结:全库恢复、单库恢复,一篇讲明白
linux·运维·服务器·数据库·mysql·adb
jessecyj1 小时前
Spring boot整合quartz方法
java·前端·spring boot
舰长1151 小时前
linux系统服务器加固1、中风险 未设置登录失败处理功能和登录连接超时处理功能。2、中风险 未限制默认账户的访问权限。3、中风险 未实现管理用户的权限分离。
linux·运维·服务器