概述

对okhttp的get,put,delete,post请求简单封装,减少了不必要的冗余代码

详细

在自己项目的开发过程中需要用到网络请求,且用的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大师发表,拒绝转载,转载需要作者授权

Okhttp实用封装的更多相关文章

  1. 最新 AFNetworking 3.0 简单实用封装

    AFNetworking 3.0 的到来使我们开发者又方便了许多,话不多说,直接上代码. 1.首先 引入框架AFNetworking框架 GitHub下载地址:https://github.com/A ...

  2. OkHttp 优雅封装 OkHttps 之 回调线程魔变

    第一篇:OkHttp 优雅封装 HttpUtils 之 气海雪山初探 第二篇:OkHttp 优雅封装 HttpUtils 之 上传下载解密 简介 HttpUtils 从 v2.3.0 之后便重命名了, ...

  3. OkHttp 优雅封装 HttpUtils 之 气海雪山初探

    曾经在代码里放荡不羁,如今在博文中日夜兼行,只为今天与你分享成果.如果觉得本文有用,记得关注我,我将带给你更多. 介绍 HttpUtils 是近期开源的对 OkHttp 轻量封装的框架,它独创的异步预 ...

  4. OkHttp 优雅封装 HttpUtils 之 上传下载解密

    曾经在代码里放荡不羁,如今在博文中日夜兼行,只为今天与你分享成果.如果觉得本文有用,记得关注我,我将带给你更多. 还没看过第一篇文章的欢迎移步:OkHttp 优雅封装 HttpUtils 之气海雪山初 ...

  5. android 开发 - 使用okhttp框架封装的开发框架

    概述 在android开发中经常要访问网络,目前最流行的网络访问框架就是Okhttp了,然而我们在具体使用时,往往仍然需要二次封装.我使用Builder设计模式进行了封装形成oknet开源库. 介绍 ...

  6. 基于OkHttp的封装库TigerOkHttp的使用

    在前面熟悉了OkHttp的用法之后,为了简化用法同时适用于我的项目,我针对OkHttp进行了更进一步的封装(源码及其Demo地址在https://github.com/huyongli/TigerOk ...

  7. 安卓OKhttp请求封装

    目前安卓开发中使用的网络工具为OKhttp,但是okhttp的使用还不是很方便,在okhttp的基础上再对请求进行封装会极大的方便网络调用. 下面直接上代码. 请求封装 public class Ht ...

  8. OKhttp的封装(下)

    OKhttpManager2.Class  请求工具类 package com.example.administrator.okhttp3; import android.os.Handler; im ...

  9. OKhttp的封装(上)

    自从介绍了OKhttp3的一些基本使用之后,又偷了下懒,所以它的续篇被搁置了一段时间,现在补充. OKhttpManager.Class  请求工具类 package com.example.admi ...

随机推荐

  1. BZOJ 3571 画框 KM算法 最小乘积最大权匹配

    题意 有n个画框和n幅画.若第i幅画和第j个画框配对,则有平凡度Aij和违和度Bij,一种配对方案的总体不和谐度为∑Aij*∑Bij.求通过搭配能得到的最小不和谐度是多少. n <= 70. 分 ...

  2. asp.net 去除数据中带有的html标签

    1,在控制器中实现去除html标签的静态方法 //去除html标签 public static string ReplaceHtmlMark(object Contents) { string Htm ...

  3. hdu 5204 Rikka with sequence 智商不够系列

    Rikka with sequence Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.p ...

  4. Unity 的一些特性

    using System; using UnityEngine; using UnityEditor; using UnityEngine.Serialization; using Random = ...

  5. mysql中日期比较大小的方法

    假如有个表product有个字段add_time,它的数据类型为datetime,有人可能会这样写sql: select * from product where add_time = '2013-0 ...

  6. 开发Google Material Design风格的WPF程序

    今天在网上看到了一个Material Design风格的WPF皮肤,看上去还是挺不错的 这个项目是开源的,感兴趣的朋友可以下载试下: https://github.com/ButchersBoy/Ma ...

  7. [译林军] 译~CrossBridge 简介

    本文由 9ria 社区译林军翻译,转载请注明出处.加入译林军 :http://bbs.9ria.com/thread-286920-1-1.html CrossBridge 是  Adobe  Fla ...

  8. Android 交叉编译程序提示(not found)

    原因是缺少库文件, 解决办法:arm-linux-readelf -a helloword | grep NEEDED 拷贝so文件到安卓下 或者 arm-linux-gcc hello.c -o h ...

  9. Storm和Spark Streaming框架对比(转)

    原文链接:Storm和Spark Streaming框架对比 Storm和Spark Streaming两个都是分布式流处理的开源框架.但是这两者之间的区别还是很大的,正如你将要在下文看到的. 处理模 ...

  10. 数学图形(2.14)Spherical helix曲线

    从http://mathworld.wolfram.com/SphericalHelix.html上找到如下一些关于该曲线的说明,不过似乎他的公式和我的脚本完全是两个东西.. The tangent  ...