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