趁周末时间撸了两天代码,将OkHttp网络请求框架进行了一次简单封装,对于实际开发非常有用。。
此次封装主要针对我们经常使用的网络请求的步骤进行封装,在已有框架OkHttp的基础上进行实际开发的封装
发送一个网络请求,有以下三个功能模块:
一:request处理
二:OkHttp核心处理
三:callback处理
我们进行网络请求组件的封装也是根据这三大模块进行封装的,下面规划一下这次封装的一个思维导图:
根据以上思维导图,我们第一步,先进行request的封装:
以下是封装的一个CommonRequest类:
1 package com.oysd.okhttp.request; 2 3 import java.util.Map; 4 5 import okhttp3.FormBody; 6 import okhttp3.Request; 7 8 /** 9 * ***************************************************************** 10 * * 文件作者:ouyangshengduo 11 * * 创建时间:2017/3/25 12 * * 文件描述:接收请求参数,为我们生成request对象 13 * * 修改历史:2017/3/25 21:02************************************* 14 **/ 15 16 public class CommonRequest { 17 18 /** 19 * 20 * @param url 21 * @param params 22 * @return返回一个创建好的Request对象 23 */ 24 public static Request createPostRequest(String url, RequestParams params){ 25 26 FormBody.Builder mFormBodyBuild = new FormBody.Builder(); 27 28 if(params != null){ 29 for(Map.Entry<String,String> entry: params.urlParams.entrySet()){ 30 //将请求参数遍历添加到我们的请求构件类中 31 mFormBodyBuild.add(entry.getKey(),entry.getValue()); 32 } 33 } 34 //通过请求构件类的build方法获取到真正的请求体对象 35 FormBody mFormBody = mFormBodyBuild.build(); 36 return new Request.Builder().url(url).post(mFormBody).build(); 37 } 38 39 /** 40 * 41 * @param url 42 * @param params 43 * @return 通过传入的参数,返回一个创建Get类型的Request对象 44 */ 45 public static Request createGetRequest(String url,RequestParams params){ 46 47 StringBuilder urlBuilder = new StringBuilder(url).append("?"); 48 if(params != null){ 49 for(Map.Entry<String,String> entry: params.urlParams.entrySet()){ 50 //将请求参数遍历添加到我们的请求构件类中 51 urlBuilder.append(entry.getKey()).append("="). 52 append(entry.getValue()).append("&"); 53 } 54 } 55 56 return new Request.Builder().url(urlBuilder.substring(0,urlBuilder.length() - 1)) 57 .get().build(); 58 } 59 60 }
其中的RequestParams功能比较简单,是封装所有的请求参数到HashMap中,可展开查看代码内容:
package com.oysd.okhttp.request; import java.io.FileNotFoundException; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * ***************************************************************** * * 文件作者:ouyangshengduo * * 创建时间:2017/3/25 * * 文件描述:封装所有的请求参数到HashMap中 * * 修改历史:2017/3/25 16:36************************************* **/ public class RequestParams { public ConcurrentHashMap<String,String> urlParams = new ConcurrentHashMap<String,String>(); public ConcurrentHashMap<String,Object> fileParams = new ConcurrentHashMap<String,Object>(); /** * Constructs a new empty {@code RequestParams} instance. */ public RequestParams() { this((Map<String, String>) null); } /** * Constructs a new RequestParams instance containing the key/value string * params from the specified map. * * @param source the source key/value string map to add. */ public RequestParams(Map<String, String> source) { if (source != null) { for (Map.Entry<String, String> entry : source.entrySet()) { put(entry.getKey(), entry.getValue()); } } } /** * Constructs a new RequestParams instance and populate it with a single * initial key/value string param. * * @param key the key name for the intial param. * @param value the value string for the initial param. */ public RequestParams(final String key, final String value) { this(new HashMap<String, String>() { { put(key, value); } }); } /** * Adds a key/value string pair to the request. * * @param key the key name for the new param. * @param value the value string for the new param. */ public void put(String key, String value) { if (key != null && value != null) { urlParams.put(key, value); } } public void put(String key, Object object) throws FileNotFoundException { if (key != null) { fileParams.put(key, object); } } public boolean hasParams() { if(urlParams.size() > 0 || fileParams.size() > 0){ return true; } return false; } }