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("系统错误,请您联系客服!");
        }
    }
 
}
相关推荐
一 乐5 小时前
婚纱摄影网站|基于ssm + vue婚纱摄影网站系统(源码+数据库+文档)
前端·javascript·数据库·vue.js·spring boot·后端
Boilermaker19925 小时前
[Java 并发编程] Synchronized 锁升级
java·开发语言
Cherry的跨界思维5 小时前
28、AI测试环境搭建与全栈工具实战:从本地到云平台的完整指南
java·人工智能·vue3·ai测试·ai全栈·测试全栈·ai测试全栈
alonewolf_996 小时前
JDK17新特性全面解析:从语法革新到模块化革命
java·开发语言·jvm·jdk
一嘴一个橘子6 小时前
spring-aop 的 基础使用(啥是增强类、切点、切面)- 2
java
sheji34166 小时前
【开题答辩全过程】以 中医药文化科普系统为例,包含答辩的问题和答案
java
1.14(java)6 小时前
SQL数据库操作:从CRUD到高级查询
数据库
恋爱绝缘体16 小时前
2020重学C++重构你的C++知识体系
java·开发语言·c++·算法·junit
wszy18097 小时前
新文章标签:让用户一眼发现最新内容
java·python·harmonyos
Full Stack Developme7 小时前
数据库索引的原理及类型和应用场景
数据库