当前位置: 代码网 > it编程>编程语言>Java > SpringBoot使用OkHttp完成高效网络请求详解

SpringBoot使用OkHttp完成高效网络请求详解

2025年03月28日 Java 我要评论
一、okhttp 简介okhttp 是一个高效的 http 客户端,它支持同步和异步请求,且具备自动处理 cookie、缓存和连接池等高级功能。与 java 原生的 httpurlconnection

一、okhttp 简介

okhttp 是一个高效的 http 客户端,它支持同步和异步请求,且具备自动处理 cookie、缓存和连接池等高级功能。

与 java 原生的 httpurlconnection 和 apache 的 httpclient 相比,okhttp 的 api 设计更加人性化,使用起来也更加方便。

二、在 spring boot 中集成 okhttp

首先,我们需要在 spring boot 项目中引入 okhttp 的依赖。

在 pom.xml 文件中添加以下依赖:

<dependency>
    <groupid>com.squareup.okhttp3</groupid>
    <artifactid>okhttp</artifactid>
    <version>4.9.3</version> <!-- 注意:版本号可能有所更新,请根据实际情况选择 -->
</dependency>

三、封装 okhttp 客户端工具类

为了方便在项目中统一管理和使用 okhttp 客户端,我们可以将其封装成一个工具类。

这个工具类将负责初始化 okhttpclient 实例、构建请求、处理响应等任务。

3.1 初始化 okhttpclient

在工具类中,我们使用单例模式来初始化 okhttpclient 实例,并设置一些全局的配置,如连接超时、读写超时等。

import okhttp3.okhttpclient;
import okhttp3.request;
import okhttp3.response;
import okhttp3.responsebody;
import okio.buffer;

import javax.net.ssl.sslcontext;
import javax.net.ssl.trustmanager;
import javax.net.ssl.x509trustmanager;
import java.io.ioexception;
import java.security.cert.certificateexception;
import java.security.cert.x509certificate;
import java.util.concurrent.timeunit;

public class okhttputil {
    
    private static final okhttpclient ok_http_client;

    static {
        trustmanager[] trustmanagers = newtrustmanager[]{
                newx509trustmanager() {
                    @override
                    publicvoidcheckclienttrusted(x509certificate[] chain, string authtype)throws certificateexception {
                    }

                    @override
                    publicvoidcheckservertrusted(x509certificate[] chain, string authtype)throws certificateexception {
                    }

                    @override
                    public x509certificate[] getacceptedissuers() {
                        returnnewx509certificate[]{};
                    }
                }
        };

        try {
            sslcontextsslcontext= sslcontext.getinstance("ssl");
            sslcontext.init(null, trustmanagers, newjava.security.securerandom());

            ok_http_client = newokhttpclient.builder()
                    .connecttimeout(15, timeunit.seconds)
                    .writetimeout(20, timeunit.seconds)
                    .readtimeout(20, timeunit.seconds)
                    .sslsocketfactory(sslcontext.getsocketfactory(), (x509trustmanager) trustmanagers[0])
                    .hostnameverifier((hostname, session) -> true)
                    .build();
        } catch (exception e) {
            thrownewruntimeexception(e);
        }
    }

    // 省略其他方法...
}

在这里,我们使用了自定义的 trustmanager 来忽略 ssl 证书验证,这通常用于开发和测试环境。

在生产环境中,应该使用正确的证书验证机制。

3.2 构建请求

接下来,我们需要在工具类中提供构建请求的方法。

这些方法将允许用户设置请求的 url、参数、头部等信息。

import okhttp3.formbody;
import okhttp3.mediatype;
import okhttp3.request;
import okhttp3.requestbody;

import java.util.linkedhashmap;
import java.util.map;
import java.util.objects;

public class okhttputil {
    
    // ... 省略其他代码

    private string url;
    private map<string, string> headers = newlinkedhashmap<>();
    private map<string, object> params = newlinkedhashmap<>();
    private request.builder requestbuilder;

    privat eokhttputil() {
        // 可以在这里添加一些全局的请求头部,比如 user-agent
        this.headers.put("user-agent", "mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/78.0.3904.108 safari/537.36");
    }

    public static okhttputil builder() {
        returnnewokhttputil();
    }

    public okhttputil url(string url) {
        this.url = url;
        returnthis;
    }

    public okhttputil addparam(string key, string value) {
        this.params.put(key, value);
        returnthis;
    }

    public okhttputil addheader(string key, string value) {
        this.headers.put(key, value);
        returnthis;
    }

    public okhttputil initget() {
        this.requestbuilder = newrequest.builder().get();
        stringbuilder urlbuilder=newstringbuilder(this.url);
        if (!this.params.isempty()) {
            urlbuilder.append("?");
            this.params.foreach((k, v) -> urlbuilder.append(k).append("=").append(v).append("&"));
            urlbuilder.deletecharat(urlbuilder.length() - 1);
        }
        this.requestbuilder.url(urlbuilder.tostring());
        returnthis;
    }

    public okhttputil initpost(boolean isjson) {
        requestbody requestbody;
        if (isjson) {
            stringjson="";
            if (!this.params.isempty()) {
                // 这里需要使用合适的 json 库将 map 转换为 json 字符串
                // 例如:json = json.tojsonstring(this.params);
                // 注意:实际代码中需要引入 json 库,并处理相关的依赖和异常
                // 为简化示例,这里省略了 json 转换的代码
            }
            requestbody = requestbody.create(json, mediatype.parse("application/json; charset=utf-8"));
        } else {
            formbody.builder formbuilder=newformbody.builder();
            this.params.foreach((k, v) -> formbuilder.add(k, v.tostring()));
            requestbody = formbuilder.build();
        }
        this.requestbuilder = newrequest.builder().post(requestbody).url(this.url);
        returnthis;
    }

    // ... 省略其他方法...
}

3.3 同步与异步请求

最后,我们需要在工具类中提供同步和异步请求的方法。

这些方法将负责发送请求并处理响应。

import okhttp3.call;
import okhttp3.callback;
import okhttp3.response;

public class okhttputil {
    
    // ... 省略其他代码

    public string sync() {
        try {
            request request=this.requestbuilder.build();
            this.headers.foreach(request::addheader);
            response response= ok_http_client.newcall(request).execute();
            if (response.issuccessful()) {
                return response.body().string();
            } else {
                return"请求失败,状态码:" + response.code();
            }
        } catch (ioexception e) {
            e.printstacktrace();
            return"请求失败,异常:" + e.getmessage();
        }
    }

    public string async() {
        final stringbuffer buffer=newstringbuffer();
        request request=this.requestbuilder.build();
        this.headers.foreach(request::addheader);
        ok_http_client.newcall(request).enqueue(newcallback() {
            @override
            public void onfailure(call call, ioexception e) {
                buffer.append("请求出错:").append(e.getmessage());
            }

            @override
            public void onresponse(call call, response response)throws ioexception {
                if (response.issuccessful()) {
                    buffer.append(response.body().string());
                } else {
                    buffer.append("请求失败,状态码:").append(response.code());
                }
            }
        });
        // 注意:这里返回的是一个空字符串或者是一个表示请求正在进行的提示
        // 因为异步请求是非阻塞的,所以不能直接返回最终的响应结果
        // 实际应用中,可以通过回调接口或者其他机制来处理异步请求的响应
    }
}

四、优化与扩展

4.1 添加请求头

在工具类中添加方法,支持自定义请求头:

public okhttputil addheader(string key, string value) {
    okhttpclient = okhttpclient.newbuilder()
            .addinterceptor(chain -> {
                requestoriginal= chain.request();
                requestnewrequest= original.newbuilder()
                        .header(key, value)
                        .build();
                return chain.proceed(newrequest);
            })
            .build();
    returnthis;
}

4.2 处理 https 请求

如果需要支持 https 请求,可以在工具类中添加 ssl 配置:

private static sslsocketfactory createsslsocketfactory() {
    try {
        sslcontextsslcontext= sslcontext.getinstance("ssl");
        sslcontext.init(null, newtrustmanager[]{newx509trustmanager() {
            @override
            publicvoidcheckclienttrusted(x509certificate[] chain, string authtype) {}

            @override
            publicvoidcheckservertrusted(x509certificate[] chain, string authtype) {}

            @override
            public x509certificate[] getacceptedissuers() {
                returnnewx509certificate[]{};
            }
        }}, newsecurerandom());
        return sslcontext.getsocketfactory();
    } catch (exception e) {
        thrownewruntimeexception(e);
    }
}

然后在初始化 okhttpclient 时使用:

okhttpclient = new okhttpclient.builder()
        .sslsocketfactory(createsslsocketfactory(), newx509trustmanager() {
            @override
            publicvoidcheckclienttrusted(x509certificate[] chain, string authtype) {}

            @override
            publicvoidcheckservertrusted(x509certificate[] chain, string authtype) {}

            @override
            public x509certificate[] getacceptedissuers() {
                returnnewx509certificate[]{};
            }
        })
        .build();

以上就是springboot使用okhttp完成高效网络请求详解的详细内容,更多关于springboot okhttp网络请求的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com