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("系统错误,请您联系客服!");
        }
    }
 
}
相关推荐
OranTech19 小时前
第28节课-夕夕超市收银系统(下)-笔记
java
LSL666_19 小时前
云服务器安装Tomcat
运维·服务器·tomcat
IDOlaoluo19 小时前
jakarta-tomcat-connectors-jk2-src.tar.gz 安装教程(详细步骤及附安装包)
java·tomcat
b***653219 小时前
自己编译RustDesk,并将自建ID服务器和key信息写入客户端
运维·服务器
SheepHappy19 小时前
MyBatis-Plus 源码阅读(三)条件构造器原理深度剖析
java·源码阅读
zhaomy202519 小时前
从ThreadLocal到ScopedValue:Java上下文管理的架构演进与实战指南
java·后端
k***459919 小时前
服务器无故nginx异常关闭之kauditd0 kswapd0挖矿病毒 CPU占用200% 内存耗尽
运维·服务器·nginx
p***629919 小时前
【Sql Server】sql server 2019设置远程访问,外网服务器需要设置好安全组入方向规则
运维·服务器·安全
用户849137175471619 小时前
从源码看设计:Java 集合框架的安全性与性能权衡 (基于 JDK 1.8)
java·面试
华仔啊19 小时前
10分钟搞定!SpringBoot+Vue3 整合 SSE 实现实时消息推送
java·vue.js·后端