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请求的回调。
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请求:
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请求:
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请求:
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如下:
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大师发表,拒绝转载,转载需要作者授权
最新文章
- webapi-1
- viewport
- a primary example for Functional programming in javascript
- 优化DP的奇淫技巧
- vue 倒计时
- Spring框架学习(二)
- iOS——百度统计
- [NOIP2009] 提高组 洛谷P1071 潜伏者
- ibatis框架文件配置
- win32线程池代码(WinApi/C++)
- Python 正则表达试
- Varnish缓存服务
- Java数据库连接泄漏应对办法-基于Weblogic服务器
- Ubuntu 服务器上面--安装和配置mysql 【转】
- CSS1 !important
- sqlserver基本增删查语句
- Angular快速学习笔记(2) -- 架构
- Python+Requests接口测试教程(2):requests
- (二)SpringMVC控制器
- Makefile 11——支持头文件目录指定
热门文章
- Boost汉字匹配 -- 宽字符
- 从网络得到数据--Arduino+以太网
- warning: suggest parentheses around assignment used as truth value
- 【转】C与CPP后缀的文件在编译时的区别
- unidac记录日志
- KVM-Introduce
- EntityFramework 7.0之初探【基于VS 2015】(
- android RecyclerView (二) ItemDecoration 详解
- Postgresql死锁的处理
- mysql创建、删除用户与授权(linux測试)