SpringBoot okhtt工具类封装方式

 更新时间:2025年03月08日 10:46:21   作者:早起的年轻人  
本文介绍了如何在SpringBoot项目中使用OkHttp工具类进行HTTP请求,并提供了一个封装了GET和POST方法的工具类示例,在Controller中使用该工具类时,需要注意OkHttpClient的静态初始化和异常处理

SpringBoot okhtt工具类封装

在 Spring Boot 项目中使用 OkHttp 可以方便地进行 HTTP 请求。

在pom.xml文件中添加 OkHttp 的依赖:

<dependencies>
    <!-- OkHttp -->
    <dependency>
        <groupId>com.squareup.okhttp3</groupId>
        <artifactId>okhttp</artifactId>
        <version>4.9.3</version>
    </dependency>
</dependencies>

以下是一个封装了常见 HTTP 请求方法(GET、POST)的 OkHttp 工具类示例

import okhttp3.*;

import java.io.IOException;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * OkHttp 工具类,封装常见的 HTTP 请求方法
 */
public class OkHttpUtils {

    private static final OkHttpClient client;

    static {
        // 初始化 OkHttpClient
        client = new OkHttpClient.Builder()
               .connectTimeout(10, TimeUnit.SECONDS) // 连接超时时间
               .readTimeout(30, TimeUnit.SECONDS)    // 读取超时时间
               .writeTimeout(30, TimeUnit.SECONDS)   // 写入超时时间
               .build();
    }

    /**
     * 发送 GET 请求
     *
     * @param url 请求的 URL
     * @return 响应结果字符串
     * @throws IOException 网络请求异常
     */
    public static String sendGetRequest(String url) throws IOException {
        Request request = new Request.Builder()
               .url(url)
               .build();

        try (Response response = client.newCall(request).execute()) {
            if (response.isSuccessful() && response.body() != null) {
                return response.body().string();
            }
            return null;
        }
    }

    /**
     * 发送带参数的 GET 请求
     *
     * @param url    请求的 URL
     * @param params 请求参数
     * @return 响应结果字符串
     * @throws IOException 网络请求异常
     */
    public static String sendGetRequest(String url, Map<String, String> params) throws IOException {
        HttpUrl.Builder urlBuilder = HttpUrl.parse(url).newBuilder();
        if (params != null) {
            for (Map.Entry<String, String> entry : params.entrySet()) {
                urlBuilder.addQueryParameter(entry.getKey(), entry.getValue());
            }
        }
        String finalUrl = urlBuilder.build().toString();

        return sendGetRequest(finalUrl);
    }

    /**
     * 发送 POST 请求,请求体为 JSON 格式
     *
     * @param url      请求的 URL
     * @param jsonBody JSON 格式的请求体
     * @return 响应结果字符串
     * @throws IOException 网络请求异常
     */
    public static String sendPostRequest(String url, String jsonBody) throws IOException {
        MediaType JSON = MediaType.get("application/json; charset=utf-8");
        RequestBody body = RequestBody.create(jsonBody, JSON);

        Request request = new Request.Builder()
               .url(url)
               .post(body)
               .build();

        try (Response response = client.newCall(request).execute()) {
            if (response.isSuccessful() && response.body() != null) {
                return response.body().string();
            }
            return null;
        }
    }

    /**
     * 发送 POST 请求,请求体为表单格式
     *
     * @param url    请求的 URL
     * @param params 表单参数
     * @return 响应结果字符串
     * @throws IOException 网络请求异常
     */
    public static String sendPostFormRequest(String url, Map<String, String> params) throws IOException {
        FormBody.Builder formBodyBuilder = new FormBody.Builder();
        if (params != null) {
            for (Map.Entry<String, String> entry : params.entrySet()) {
                formBodyBuilder.add(entry.getKey(), entry.getValue());
            }
        }
        RequestBody formBody = formBodyBuilder.build();

        Request request = new Request.Builder()
               .url(url)
               .post(formBody)
               .build();

        try (Response response = client.newCall(request).execute()) {
            if (response.isSuccessful() && response.body() != null) {
                return response.body().string();
            }
            return null;
        }
    }
}

使用示例

以下是如何在 Spring Boot 的 Controller 中使用这个工具类:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/http")
public class HttpController {

    @GetMapping("/get")
    public String getRequest() throws IOException {
        String url = "https://jsonplaceholder.typicode.com/todos/1";
        return OkHttpUtils.sendGetRequest(url);
    }

    @GetMapping("/getWithParams")
    public String getRequestWithParams() throws IOException {
        String url = "https://jsonplaceholder.typicode.com/posts";
        Map<String, String> params = new HashMap<>();
        params.put("userId", "1");
        return OkHttpUtils.sendGetRequest(url, params);
    }

    @GetMapping("/postJson")
    public String postJsonRequest() throws IOException {
        String url = "https://jsonplaceholder.typicode.com/posts";
        String jsonBody = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}";
        return OkHttpUtils.sendPostRequest(url, jsonBody);
    }

    @GetMapping("/postForm")
    public String postFormRequest() throws IOException {
        String url = "https://jsonplaceholder.typicode.com/posts";
        Map<String, String> params = new HashMap<>();
        params.put("title", "foo");
        params.put("body", "bar");
        params.put("userId", "1");
        return OkHttpUtils.sendPostFormRequest(url, params);
    }
}

注意事项

  • 此工具类中的 OkHttpClient 是静态初始化的,在整个应用程序中共享一个实例,以提高性能和复用连接。
  • 对于异常处理,当前示例只是简单地将 IOException 抛出,在实际应用中,你可能需要根据具体情况进行更详细的异常处理,例如记录日志、返回合适的错误信息等。
  • 确保在使用时处理好可能的网络异常和超时情况,以保证应用程序的健壮性。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java数组复制的四种方法效率对比

    java数组复制的四种方法效率对比

    这篇文章主要介绍了java数组复制的四种方法效率对比,文中有简单的代码示例,以及效率的比较结果,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java异常基础知识解析

    Java异常基础知识解析

    这篇文章主要介绍了Java异常基础知识解析,具有一定借鉴价值,需要的朋友可以资参考下。
    2017-12-12
  • java垃圾回收之实现并行GC算法

    java垃圾回收之实现并行GC算法

    这篇文章主要为大家介绍了java垃圾回收之实现并行GC算法的详细讲解,让我们看看并行垃圾收集器的GC日志长什么样, 从中我们可以得到哪些有用信息
    2022-01-01
  • 用Java设计模式中的观察者模式开发微信公众号的例子

    用Java设计模式中的观察者模式开发微信公众号的例子

    这篇文章主要介绍了用Java设计模式中的观察者模式开发微信公众号的例子,这里Java的微信SDK等部分便不再详述,只注重关键部分和开发过程中观察者模式优点的体现,需要的朋友可以参考下
    2016-02-02
  • seata springcloud整合教程与遇到的坑

    seata springcloud整合教程与遇到的坑

    seata 是alibaba 出的一款分布式事务管理器,他有侵入性小,实现简单等特点。这篇文章主要介绍了seata springcloud整合教程与遇到的坑,需要的朋友可以参考下
    2021-07-07
  • Flink开发IDEA环境搭建与测试的方法

    Flink开发IDEA环境搭建与测试的方法

    这篇文章主要介绍了Flink开发IDEA环境搭建与测试的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • spring消息转换器使用详解

    spring消息转换器使用详解

    这篇文章主要为大家详细介绍了spring消息转换器的使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • springboot中手动提交事务的实现方法

    springboot中手动提交事务的实现方法

    手动提交事务可以提供更灵活的控制,以便在分布式环境中处理事务的提交和回滚,本文就来介绍一下springboot中手动提交事务的实现方法,感兴趣的可以了解一下
    2024-01-01
  • Java数据结构之选择排序算法的实现与优化

    Java数据结构之选择排序算法的实现与优化

    选择排序:(Selection sort)是一种简单直观的排序算法,也是一种不稳定的排序方法。本文主要为大家介绍一下选择排序的实现与优化,希望对大家有所帮助
    2023-01-01
  • Java中的@SneakyThrows注解详解

    Java中的@SneakyThrows注解详解

    这篇文章主要介绍了Java中的@SneakyThrows注解详解,@SneakyThrows将当前方法抛出的异常,包装成RuntimeException,骗过编译器,使得调用点可以不用显示处理异常信息,需要的朋友可以参考下
    2023-10-10

最新评论