Okhttp实用封装
概述
详细
在自己项目的开发过程中需要用到网络请求,且用的okhttp网络框架,虽然用起来很方便,但是倒出充斥着重复代码,所以在研究了okhttp源码的基础上对Okhttp的使用进行了封装,结构清晰,可以满足基本的上传、下载、put,delete,get,post请求。如果想了解okhttp的工作原理,也可以参考本文后面留的博客地址
一、准备工作
在gradle文件中配置:
compile "com.squareup.okhttp3:okhttp:3.8.0"
二、程序实现
1、封装库的代码结构如下:
interf包:提供了IHttpConnect接口作为一个http链接,IResponse接口作为网络返回的响应接口;IRequestCallback接口作为每一个request请求的回调。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public interface IHttpConnect { /** * 异步请求 */ void asyncConnect( @NonNull HttpRequest request); /** * 同步链接请求,不能在主线程中调用,只能在异步线程中,并且注意同步引起的性能问题 */ @WorkerThread IResponse syncConnect( @NonNull HttpRequest request); void abort(HttpRequest request); void abortAll(); } |
impl包:提供了一些IRequestCallback的简单实现,比如DownLoadCallback实现了文件下载功能。
okhttp包:其中OkhttoConnect是IHttpConnect接口的实现类,OkhttpHelper具体实现了Okhttp发起网络请求的功能。
request包:提供了OkhttpRequest类,作为请求参数的包装类。UploadFileReqeust作为文件上传用
response包:提供了OkResponse对象,作为Okhttp请求返回的封装
ConnectHelper:对我提供的IHttpConnect的适配类,其具体工作交给IHttpConnect的具体实现类,为简单的适配器模式
2、实现思路
从设计思路上来看,一个Request就是一个IHttpConnect发起的一个同步或者异步请求的过程,对于同步请求来说就是一个IHttpConnect实现类发起的syncConnect(Httprequest)过程,异步请求就是IHttpConnect发起的asyncConne(HttpRequest)过程。
3、简单的get请求:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | ConnectHelper connectHelper = new ConnectHelper(); HttpRequest.Builder builder = new HttpRequest.Builder(); builder.setUrl( "http://www.baidu.com" ) .addHeader( "xxx" , "yyyy" ) .addParams( "xxx" , "yyyy" ) .setParams(map) .setHeaders(map) .setCallback( new RequestCallbackImpl() { @Override public void requestFinish(HttpRequest request, IResponse response) { } }); HttpRequest request = builder.build(); connectHelper.asyncConnect(request); |
4、简单的post请求:
1 2 3 4 5 6 7 8 9 10 11 12 13 | HttpRequest.Builder builder = new HttpRequest.Builder(); builder.setUrl( "http://www.baidu.com" ) .setRequestType(RequestType.DELETE) .addHeader( "xxx" , "yyyy" ) .addParams( "xxx" , "yyyy" ) .setCallback( new RequestCallbackImpl() { @Override public void requestFinish(HttpRequest request, IResponse response) { } }); HttpRequest request = builder.build(); connectHelper.asyncConnect(request); |
5、简单的put请求:
1 2 3 4 5 6 7 8 9 10 11 12 13 | HttpRequest.Builder builder = new HttpRequest.Builder(); builder.setUrl( "http://www.baidu.com" ) .setRequestType(RequestType.PUT) .addHeader( "xxx" , "yyyy" ) .addParams( "xxx" , "yyyy" ) .setCallback( new RequestCallbackImpl() { @Override public void requestFinish(HttpRequest request, IResponse response) { } }); HttpRequest request = builder.build(); connectHelper.asyncConnect(request); |
如果想使用文件下载功能,把callback传DownLoadCallback即可
三、运行效果
比如get请求获取字符串的requestCallBack如下:
1 2 3 4 5 6 7 8 9 10 | setUrl( "http://www.baidu.com" ) .addHeader( "xxx" , "yyyy" ) .addParams( "xxx" , "yyyy" ) .setCallback( new RequestCallbackImpl() { @Override public void requestFinish(HttpRequest request, IResponse response) { System.out.print( "respose ==" + response.getString()); } }); |
运行打印效果如下:
四、其他补充
1、除了addHeaders和addParams之外,如果需要批量添加一些header或者param也可以调用Builder的setHeaders(map)或者setParams(map)方法,将headers或者params放入map里面一次构建完成
2、如果需了解okhttp的工作原理的话,可以参考Ohttp源码分析系列博客
注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?