一、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网络请求的资料请关注代码网其它相关文章!
发表评论