OkHttp 的强大算是毋庸置疑了;OkHttp 基本在网络层能完成任何事情,适用任何情况;正因为如此 OkHttp 每次构建一个请求的时候不得不写大量的代码来完成相应的配置。在这里分享一个极限封装OkHttp的辅助框架,通过该框架能最大程度简化你的开发负担。好话不多说,往下看看就知道好不好。
原生
在这里举例几个原生情况下使用 okhttp 的情况。
GET
<code class="hljs java has-numbering"> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">get</span>() { Request.Builder builder = <span class="hljs-keyword">new</span> Request.Builder() .url(<span class="hljs-string">"http://www.xx.com?id=dd&aa=sdd"</span>) .get(); Request request = builder.build(); Call call = <span class="hljs-keyword">new</span> OkHttpClient().newCall(request); <span class="hljs-comment">// 同步</span> <span class="hljs-keyword">try</span> { call.execute(); } <span class="hljs-keyword">catch</span> (IOException e) { e.printStackTrace(); } <span class="hljs-comment">// 异步</span> call.enqueue(<span class="hljs-keyword">new</span> Callback() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onFailure</span>(Request request, IOException e) { } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onResponse</span>(Response response) <span class="hljs-keyword">throws</span> IOException { } }); }</code>
Form
<code class="hljs cs has-numbering"> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">form</span>() { FormEncodingBuilder formEncodingBuilder = <span class="hljs-keyword">new</span> FormEncodingBuilder(); <span class="hljs-comment">// Add values</span> formEncodingBuilder.add(<span class="hljs-string">"id"</span>, <span class="hljs-string">"dd"</span>); formEncodingBuilder.add(<span class="hljs-string">"name"</span>, <span class="hljs-string">"sdd"</span>); RequestBody body = formEncodingBuilder.build(); Request request = <span class="hljs-keyword">new</span> Request.Builder().post(body).build(); <span class="hljs-comment">// do call...</span> }</code>
文件
<code class="hljs avrasm has-numbering"> public void file() { MultipartBuilder builder = new MultipartBuilder()<span class="hljs-comment">;</span> builder<span class="hljs-preprocessor">.type</span>(MultipartBuilder<span class="hljs-preprocessor">.FORM</span>)<span class="hljs-comment">;</span> builder<span class="hljs-preprocessor">.addFormDataPart</span>(<span class="hljs-string">"id"</span>, <span class="hljs-string">"dd"</span>)<span class="hljs-comment">;</span> builder<span class="hljs-preprocessor">.addFormDataPart</span>(<span class="hljs-string">"name"</span>, <span class="hljs-string">"sdd"</span>)<span class="hljs-comment">;</span> RequestBody fileBody = RequestBody<span class="hljs-preprocessor">.create</span>(MediaType<span class="hljs-preprocessor">.parse</span>(<span class="hljs-string">"image/png"</span>), new File(<span class="hljs-string">"aa.png"</span>))<span class="hljs-comment">;</span> builder<span class="hljs-preprocessor">.addFormDataPart</span>(<span class="hljs-string">"head"</span>, <span class="hljs-string">"aa.png"</span>, fileBody)<span class="hljs-comment">;</span> RequestBody body = builder<span class="hljs-preprocessor">.build</span>()<span class="hljs-comment">;</span> Request request = new Request<span class="hljs-preprocessor">.Builder</span>()<span class="hljs-preprocessor">.post</span>(body)<span class="hljs-preprocessor">.build</span>()<span class="hljs-comment">;</span> // do <span class="hljs-keyword">call</span>... }</code>
不得不说,okhttp算是封装的非常Nice的框架,就算是文件发送也只是简单的几行代码就OK了。
不过假如我们需要在返回时进行UI切换,或者返回的数据进行对应的JSON解析呢?
也很简单就是得到数据后然后来一个线程切换,然后再使用GSON解析一下就好。但是我们是否还可以简化呢?因为每次请求都需要构建build-request-发送-解析,这些操作很少,但是没必要没错重复。
初衷
之所以再次封装,就是为了让每次的build过程不再出现,当然功能肯定不能仅仅局限于此。
假如你现在登录后得到一个ID,要求后续操作都带上ID进行操作你会怎么办?
难道每次请求参数中都加上一次?这就是一个值得封装的地方。
封装只是为了能更加简单,仅此而已~
功能
- UI 线程切换
- 可选择的Callback(任意选择UI线程或者子线程)
- 参数规范化,GET与POST都一样的传参方式
- 上传/下载进度回调
- 可以简单的设置Head部分
- 可以每次请求时自动加上需要的参数
- String/JSON/byte/File… 都能一样简单
用法
由于辅助代码较多,在这里就不一一贴出来了,在这里仅仅演示如何使用。
异步GET
<code class="hljs vbscript has-numbering"> Http.getAsync(<span class="hljs-string">"http://wthrcdn.etouch.cn/weather_mini"</span>, <span class="hljs-keyword">new</span> UiCallback<<span class="hljs-built_in">String</span>>() { @Override <span class="hljs-keyword">public</span> void onFailure(<span class="hljs-built_in">Request</span> <span class="hljs-built_in">request</span>, <span class="hljs-built_in">Response</span> <span class="hljs-built_in">response</span>, Exception e) { <span class="hljs-built_in">log</span>(<span class="hljs-string">"getAsync:onFailed"</span>); } @Override <span class="hljs-keyword">public</span> void onSuccess(<span class="hljs-built_in">String</span> <span class="hljs-built_in">response</span>, <span class="hljs-built_in">int</span> code) { <span class="hljs-built_in">log</span>(<span class="hljs-string">"getAsync:onSuccess:"</span> + <span class="hljs-built_in">response</span>); } }, <span class="hljs-keyword">new</span> StrParam(<span class="hljs-string">"citykey"</span>, <span class="hljs-number">101010100</span>) );</code>
由于是 get 请求,在这里参数中的 citykey 会被自动解析到 url 中。
<code class="hljs avrasm has-numbering"><span class="hljs-label">http:</span>//wthrcdn<span class="hljs-preprocessor">.etouch</span><span class="hljs-preprocessor">.cn</span>/weather_mini?citykey=<span class="hljs-number">101010100</span></code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>
同步GET
<code class="hljs vbscript has-numbering">final <span class="hljs-built_in">String</span> url = <span class="hljs-string">"http://wthrcdn.etouch.cn/weather_mini?citykey=101010100"</span>; <span class="hljs-built_in">String</span> str = Http.getSync(<span class="hljs-built_in">String</span>.<span class="hljs-keyword">class</span>, url); <span class="hljs-built_in">log</span>(<span class="hljs-string">"getSync1:"</span> + str); str = Http.getSync(url, <span class="hljs-keyword">new</span> ThreadCallback<<span class="hljs-built_in">String</span>>() { @Override <span class="hljs-keyword">public</span> void onFailure(<span class="hljs-built_in">Request</span> <span class="hljs-built_in">request</span>, <span class="hljs-built_in">Response</span> <span class="hljs-built_in">response</span>, Exception e) { <span class="hljs-built_in">log</span>(<span class="hljs-string">"getSync2:onFailed"</span>); } @Override <span class="hljs-keyword">public</span> void onSuccess(<span class="hljs-built_in">String</span> <span class="hljs-built_in">response</span>, <span class="hljs-built_in">int</span> code) { <span class="hljs-built_in">log</span>(<span class="hljs-string">"getSync2:onSuccess:"</span> + <span class="hljs-built_in">response</span>); } }); <span class="hljs-built_in">log</span>(<span class="hljs-string">"getSync2:"</span> + str);</code>
同步方式支持两种情况,一种有Callback,一种是没有。
当然就算加上了Callback也并不是异步,此时方法会等到执行完成后才会继续往下走。之所以这么干,是为了方便在callback中直接处理ui的事儿。
在这里有必要说明一下,返回类型需要进行指定,如果没有Callback哪么需要你传入返回类型class。
当然如果你传入了callback,哪么此时class就由callback
<code class="hljs vbnet has-numbering">Account account = Http.getSync(Account.<span class="hljs-keyword">class</span>, url); User user = Http.getSync(User.<span class="hljs-keyword">class</span>, url); <span class="hljs-built_in">String</span> str = Http.getSync(<span class="hljs-built_in">String</span>.<span class="hljs-keyword">class</span>, url, <span class="hljs-keyword">new</span> StrParam(<span class="hljs-string">"citykey"</span>, <span class="hljs-number">101010100</span>));</code>allback 的情况也如上所示。
异步与同步的区别在于方法名称:
- Http.getSync()
- Http.getAsync()
- Http.postSync()
- Http.postAsync()
- Http.uploadSync()
- Http.uploadAsync()
- Http.downloadSync()
- Http.downloadAsync()
默认情况下,upload与download具有callProgress 回调进度功能。
POST
<code class="hljs vbscript has-numbering"> <span class="hljs-built_in">String</span> value1 = <span class="hljs-string">"xxx"</span>; <span class="hljs-built_in">String</span> value2 = <span class="hljs-string">"xxx"</span>; <span class="hljs-built_in">String</span> url = <span class="hljs-string">"http://www.baidu.com"</span>; Http.postAsync(url, <span class="hljs-keyword">new</span> HttpCallback<<span class="hljs-built_in">String</span>>() { @Override <span class="hljs-keyword">public</span> void onFailure(<span class="hljs-built_in">Request</span> <span class="hljs-built_in">request</span>, <span class="hljs-built_in">Response</span> <span class="hljs-built_in">response</span>, Exception e) { e.printStackTrace(); } @Override <span class="hljs-keyword">public</span> void onSuccess(<span class="hljs-built_in">String</span> <span class="hljs-built_in">response</span>, <span class="hljs-built_in">int</span> code) { <span class="hljs-built_in">log</span>(<span class="hljs-built_in">response</span>); } }, <span class="hljs-keyword">new</span> StrParam(<span class="hljs-string">"value1"</span>, value1), <span class="hljs-keyword">new</span> StrParam(<span class="hljs-string">"value2"</span>, value2));</code>
post 的请求方法与get基本如出一辙。
Upload
<code class="hljs java has-numbering">File file = getAssetsFile(); Http.uploadAsync(<span class="hljs-string">"http://img.hoop8.com/upload.php"</span>, <span class="hljs-string">"uploadimg"</span>, file, <span class="hljs-keyword">new</span> UiCallback<String>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onProgress</span>(<span class="hljs-keyword">long</span> current, <span class="hljs-keyword">long</span> count) { <span class="hljs-keyword">super</span>.onProgress(current, count); log(<span class="hljs-string">"uploadAsync onProgress:"</span> + current + <span class="hljs-string">"/"</span> + count); mUpload.setProgress((<span class="hljs-keyword">int</span>) ((current * <span class="hljs-number">100.00</span> / count))); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onFailure</span>(Request request, Response response, Exception e) { e.printStackTrace(); log(<span class="hljs-string">"uploadAsync onFailed"</span>); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onSuccess</span>(String response, <span class="hljs-keyword">int</span> code) { log(<span class="hljs-string">"uploadAsync onSuccess:"</span> + response); } });</code>
上传部分也很简单,如果需要带有参数哪么和Post的使用方式一样。当然此时传入参数就不是 StrParam 而是 IOParam.
上传的时候你可以仅仅传递文件+文件对应的name;或者 传递 IOParam; 也可以 StrParam+IOParam的方式;当然终极一点你可以传递:Param 类型。
Param 类型是 StrParam 与 IOParam 的结合体。
哪么上传你也可以这样:
<code class="hljs cs has-numbering">Http.uploadAsync(<span class="hljs-string">"url"</span>, callback, <span class="hljs-keyword">new</span> IOParam(<span class="hljs-string">"uploadimg"</span>, file)); Http.uploadAsync(<span class="hljs-string">"url"</span>, callback, <span class="hljs-keyword">new</span> StrParam[]{<span class="hljs-keyword">new</span> StrParam(<span class="hljs-string">"id"</span>, <span class="hljs-number">123456</span>), <span class="hljs-keyword">new</span> StrParam(<span class="hljs-string">"name"</span>, <span class="hljs-string">"qiujuer"</span>)}, <span class="hljs-keyword">new</span> IOParam(<span class="hljs-string">"uploadimg"</span>, file)); Http.uploadAsync(<span class="hljs-string">"url"</span>, callback, <span class="hljs-keyword">new</span> Param(<span class="hljs-string">"id"</span>, <span class="hljs-number">123456</span>), <span class="hljs-keyword">new</span> Param(<span class="hljs-string">"name"</span>, <span class="hljs-string">"qiujuer"</span>), <span class="hljs-keyword">new</span> Param(<span class="hljs-string">"uploadimg"</span>, file));</code>
Download
<code class="hljs java has-numbering">Http.downloadAsync(<span class="hljs-string">"https://raw.githubusercontent.com/qiujuer/OkHttpPacker/master/release/sample.apk"</span>, getSDPath(), <span class="hljs-keyword">null</span>, <span class="hljs-keyword">null</span>, <span class="hljs-keyword">new</span> UiCallback<File>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onProgress</span>(<span class="hljs-keyword">long</span> current, <span class="hljs-keyword">long</span> count) { <span class="hljs-keyword">super</span>.onProgress(current, count); log(<span class="hljs-string">"downloadAsync onProgress:"</span> + current + <span class="hljs-string">"/"</span> + count); mDownload.setProgress((<span class="hljs-keyword">int</span>) ((current * <span class="hljs-number">100.00</span> / count))); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onFailure</span>(Request request, Response response, Exception e) { e.printStackTrace(); log(<span class="hljs-string">"downloadAsync onFailed"</span>); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onSuccess</span>(File response, <span class="hljs-keyword">int</span> code) { log(<span class="hljs-string">"downloadAsync onSuccess:"</span> + response.getAbsolutePath()); } });</code>
下载这里为了方便所以强制返回File,哪么你拿到的时候就是下载好的文件了。
下载只有异步方式,也同样支持传入参数。
而在传入参数上,你可以仅仅传递一个存储目录,此时文件名会根据url进行指定。
当然你还可以传递目录+文件名。
也或者你直接传入一个文件(File)。
其中的Object是用于传入时设置Tag,方便OKHTTP进行cancel()取消。
参数
在所有方式中 Post 支持参数最多,所以这里就使用 Post 进行演示。
<code class="hljs javascript has-numbering"><span class="hljs-comment">// 无参数情况</span> Http.postAsync(<span class="hljs-string">"url"</span>, callback); <span class="hljs-comment">// StrParam</span> Http.postAsync(<span class="hljs-string">"url"</span>, callback, <span class="hljs-keyword">new</span> StrParam(<span class="hljs-string">"id"</span>, <span class="hljs-number">113321</span>)); <span class="hljs-comment">// List</span> List<StrParam> strParamList = <span class="hljs-keyword">new</span> ArrayList<>(); strParamList.add(<span class="hljs-keyword">new</span> StrParam(<span class="hljs-string">"id"</span>, <span class="hljs-number">113321</span>)); Http.postAsync(<span class="hljs-string">"url"</span>, callback, strParamList); <span class="hljs-comment">// Map</span> Map<<span class="hljs-built_in">String</span>, <span class="hljs-built_in">String</span>> strParamMap = <span class="hljs-keyword">new</span> HashMap<>(); strParamMap.put(<span class="hljs-string">"id"</span>, <span class="hljs-string">"113321"</span>); Http.postAsync(<span class="hljs-string">"url"</span>, callback, strParamMap); <span class="hljs-comment">// String</span> Http.postAsync(<span class="hljs-string">"url"</span>, callback, <span class="hljs-string">"This is post body."</span>); <span class="hljs-comment">// Byte</span> Http.postAsync(<span class="hljs-string">"url"</span>, callback, <span class="hljs-keyword">new</span> byte[]{<span class="hljs-number">1</span>, <span class="hljs-number">2</span>}); <span class="hljs-comment">// File</span> Http.postAsync(<span class="hljs-string">"url"</span>, callback, <span class="hljs-keyword">new</span> File(<span class="hljs-string">"img.png"</span>)); <span class="hljs-comment">// JSON</span> JSONObject jsonObject = <span class="hljs-keyword">new</span> JSONObject(<span class="hljs-string">"json data"</span>); Http.postAsync(<span class="hljs-string">"url"</span>, callback, jsonObject); <span class="hljs-comment">// JSONArray</span> JSONArray jsonArray = <span class="hljs-keyword">new</span> JSONArray(); Http.postAsync(<span class="hljs-string">"url"</span>, callback, jsonArray);</code>
请求构建
在本框架中,所有的请求都会把url与参数经过请求构建器进行请求体构建。所以如果你需要为你的每一个请求都带上特定的参数是非常简单的。
第一种方式:
<code class="hljs java has-numbering">RequestBuilder builder = Http.getInstance().getRequestBuilder(); ((RequestCallBuilder) builder).setBuilderListener(<span class="hljs-keyword">new</span> RequestCallBuilder.BuilderListener() { <span class="hljs-comment">// 请求头构建,在这里你可以做一些请求头的初始化操作</span> <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreateBuilder</span>(Request.Builder builder) { builder.addHeader(<span class="hljs-string">"User-Agent"</span>, <span class="hljs-string">"User-Agent"</span>); builder.addHeader(<span class="hljs-string">"Head-Content"</span>, <span class="hljs-string">"Head-Content"</span>); } <span class="hljs-comment">// 构建Get时调用</span> <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">onBuildGetParams</span>(StringBuilder sb, <span class="hljs-keyword">boolean</span> isFirst) { <span class="hljs-comment">// isFirst 用于告知是否是第一个参数</span> <span class="hljs-comment">// 因为GET请求第一个参数是加上 "?" ,而其后参数则是加上 "&"</span> <span class="hljs-comment">// 返回时也用于告知当前参数中是否已经有参数了,</span> <span class="hljs-comment">// 如果已经有了哪么返回 false ,没有加上任何参数 返回 true</span> <span class="hljs-comment">// 或许把名称改成 haveParam 要恰当一点</span> <span class="hljs-keyword">if</span> (isFirst) { isFirst = <span class="hljs-keyword">false</span>; sb.append(<span class="hljs-string">"?"</span>); } <span class="hljs-keyword">else</span> { sb.append(<span class="hljs-string">"&"</span>); } sb.append(<span class="hljs-string">"uid="</span>); sb.append(<span class="hljs-string">"qiujuer"</span>); <span class="hljs-keyword">return</span> isFirst; } <span class="hljs-comment">// 构建 Form body 时调用</span> <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onBuildFormBody</span>(FormEncodingBuilder formEncodingBuilder) { formEncodingBuilder.add(<span class="hljs-string">"uid"</span>, <span class="hljs-string">"qiujuer"</span>); } <span class="hljs-comment">// 构建 Multipart body 时调用</span> <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onBuildMultipartBody</span>(MultipartBuilder multipartBuilder) { multipartBuilder.addFormDataPart(<span class="hljs-string">"uid"</span>, <span class="hljs-string">"qiujuer"</span>); } });</code>
第二种
<code class="hljs java has-numbering"><span class="hljs-keyword">import</span> com.squareup.okhttp.FormEncodingBuilder; <span class="hljs-keyword">import</span> com.squareup.okhttp.MultipartBuilder; <span class="hljs-keyword">import</span> com.squareup.okhttp.Request; <span class="hljs-keyword">import</span> net.qiujuer.common.okhttp.impl.RequestCallBuilder; <span class="hljs-javadoc">/** * Created by qiujuer * on 16/1/13. */</span> <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyRequestBuilder</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">RequestCallBuilder</span> {</span> <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">protected</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">buildGetParams</span>(StringBuilder sb, <span class="hljs-keyword">boolean</span> isFirst) { <span class="hljs-keyword">if</span> (isFirst) { isFirst = <span class="hljs-keyword">false</span>; sb.append(<span class="hljs-string">"?"</span>); } <span class="hljs-keyword">else</span> { sb.append(<span class="hljs-string">"&"</span>); } sb.append(<span class="hljs-string">"uid="</span>); sb.append(<span class="hljs-string">"qiujuer"</span>); <span class="hljs-keyword">return</span> isFirst && <span class="hljs-keyword">super</span>.buildGetParams(sb, isFirst); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">protected</span> FormEncodingBuilder <span class="hljs-title">buildFormBody</span>(FormEncodingBuilder formEncodingBuilder) { formEncodingBuilder.add(<span class="hljs-string">"uid"</span>, <span class="hljs-string">"qiujuer"</span>); <span class="hljs-keyword">return</span> <span class="hljs-keyword">super</span>.buildFormBody(formEncodingBuilder); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">protected</span> MultipartBuilder <span class="hljs-title">buildMultipartBody</span>(MultipartBuilder multipartBuilder) { multipartBuilder.addFormDataPart(<span class="hljs-string">"uid"</span>, <span class="hljs-string">"qiujuer"</span>); <span class="hljs-keyword">return</span> <span class="hljs-keyword">super</span>.buildMultipartBody(multipartBuilder); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">protected</span> Request.Builder <span class="hljs-title">createBuilder</span>() { Request.Builder builder = <span class="hljs-keyword">super</span>.createBuilder(); builder.addHeader(<span class="hljs-string">"User-Agent"</span>, <span class="hljs-string">"User-Agent"</span>); builder.addHeader(<span class="hljs-string">"Head-Content"</span>, <span class="hljs-string">"Head-Content"</span>); <span class="hljs-keyword">return</span> builder; } }</code>
<code class="hljs avrasm has-numbering">Http<span class="hljs-preprocessor">.getInstance</span>()<span class="hljs-preprocessor">.setRequestBuilder</span>(new MyRequestBuilder())<span class="hljs-comment">;</span></code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>
两种办法都是OK的,不过建议第一种,方便快捷。以后可以在第一种的方式上再封装一次,封装到 Param 层次那就简单了。
解析器
在本框架中,所有的返回都会经过解析器对返回数据进行解析;这也就达到了直接把 JSON 数据解析为 Class 的目的。
默认情况下采用GSON进行解析。你也可以重写解析器。
GSON配置
有时候返回的数据样式并不是 Gson 的默认样式(一般是时间字符串),此时会导致解析失败,这里提供一种简单的办法。
<code class="hljs avrasm has-numbering">GsonBuilder gsonBuilder = new GsonBuilder()<span class="hljs-comment">;</span> gsonBuilder<span class="hljs-preprocessor">.setDateFormat</span>(<span class="hljs-string">"yyyy-MM-dd HH:mm:ss"</span>)<span class="hljs-comment">;</span> Gson gson = gsonBuilder<span class="hljs-preprocessor">.create</span>()<span class="hljs-comment">;</span> Http<span class="hljs-preprocessor">.getInstance</span>()<span class="hljs-preprocessor">.setResolver</span>(new GsonResolver(gson))<span class="hljs-comment">;</span></code>
FastJson
如果你不想使用 Gson进行解析,或许你会采用FastJson,哪么你可以重写实现解析器。
<code class="hljs java has-numbering"><span class="hljs-keyword">import</span> net.qiujuer.common.okhttp.core.Resolver; <span class="hljs-keyword">import</span> java.lang.reflect.Type; <span class="hljs-javadoc">/** * Created by qiujuer * on 16/1/13. */</span> <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyResolver</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Resolver</span> {</span> <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> Object <span class="hljs-title">analysis</span>(String rsp, Type type) { <span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>; } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> Object <span class="hljs-title">analysis</span>(String rsp, Class<?> subclass) { <span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>; } }</code>
解析方法有两种,两个方法你都需要自己去完善。
rsp 是网络返回的字符串。
Type 是等待返回的 ClassType
Cookie
关于 Cookie 支持,默认情况下 Cookie 存储是处于关闭状态,如果你想要存储网址Cookie到本地文件,并每次访问时都使用当前Cookie。
<code class="hljs scss has-numbering"><span class="hljs-comment">// 允许存储Cookie</span> Http<span class="hljs-class">.enableSaveCookie</span>(<span class="hljs-function">getApplication()</span>); <span class="hljs-comment">// 清理Cookie</span> Http<span class="hljs-class">.removeCookie</span>(); <span class="hljs-comment">// 得到所有Cookie</span> Http<span class="hljs-class">.getCookie</span>();</code>
OkHttpClient
有时你需要拿到当前的 Client ,比如你可以把 Client 设置为 Glide 的网络驱动器。
<code class="hljs avrasm has-numbering">OkHttpClient client = Http<span class="hljs-preprocessor">.getClient</span>()<span class="hljs-comment">;</span> // Glide Glide<span class="hljs-preprocessor">.get</span>(application)<span class="hljs-preprocessor">.register</span>(GlideUrl<span class="hljs-preprocessor">.class</span>, InputStream<span class="hljs-preprocessor">.class</span>, new OkHttpUrlLoader<span class="hljs-preprocessor">.Factory</span>(client))<span class="hljs-comment">;</span></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul>
调试
如果你需要知道每次请求Url与参数信息,你可以打开LOG开关。
<code class="hljs bash has-numbering">Http.DEBUG = <span class="hljs-literal">true</span>;</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>
关于 HTTPS
在当前框架中并没有直接集成 HTTPS 的支持,而是采用了一个 CertTool 证书 工具来进行 HTTPS 支持。
通过 CertTool 你可以方便的设置一个本地证书文件进行 HTTPS 请求。
<code class="hljs vhdl has-numbering">CertTool.setCertificates(Http.getClient(),<span class="hljs-keyword">new</span> FileInputStream(<span class="hljs-keyword">new</span> <span class="hljs-keyword">File</span>()));</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>
Callback
HttpCallback
该Callback为默认需要,其中:
- onStart UI 线程中执行
- onFinish UI 线程中执行
- onProgress, onFailure, onSuccess 子线程中执行
ThreadCallback
所有回调全部在子线程中执行。
UICallback
所有回调在UI线程中执行。
项目地址
https://github.com/qiujuer/OkHttpPacker
如果使用上有任何问题欢迎提交 issues 。