okHttp3自用封装

okHttp都已经出到3.2.0了,现在才开始要用到它,感觉自己好low~~

根据平时自己的习惯,还是自己做一下封装,让代码撸起来更加顺畅一点!

okhttp-3.2.0和okio-1.7.0就不多说

首先建一个OkHttpUtils的类

 

[java]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
  1. /** 
  2.  * HTTP通讯结构处理器 
  3.  * 
  4.  */  
  5. public class OkHttpUtils {  
  6.   
  7.     private static final byte[] LOCKER = new byte[0];  
  8.     private static OkHttpUtils mInstance;  
  9.     private OkHttpClient mOkHttpClient;  
  10.   
  11.     private OkHttpUtils() {  
  12.         okhttp3.OkHttpClient.Builder ClientBuilder=new okhttp3.OkHttpClient.Builder();  
  13.         ClientBuilder.readTimeout(30, TimeUnit.SECONDS);//读取超时  
  14.         ClientBuilder.connectTimeout(10, TimeUnit.SECONDS);//连接超时  
  15.         ClientBuilder.writeTimeout(60, TimeUnit.SECONDS);//写入超时  
  16.         mOkHttpClient=ClientBuilder.build();  
  17.     }  
  18.   
  19.     public static OkHttpUtils getInstance() {  
  20.         if (mInstance == null) {  
  21.             synchronized (LOCKER) {  
  22.                 if (mInstance == null) {  
  23.                     mInstance = new OkHttpUtils();  
  24.                 }  
  25.             }  
  26.         }  
  27.         return mInstance;  
  28.     }  
  29. }  



 

 

 

以上的代码和网上其他okhttp3的写法是不一样的。一般网上的代码是下面这样的

 

[java]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
  1. mOkHttpClient = new OkHttpClient.Builder()    
  2. .readTimeout(30, TimeUnit.SECONDS)  
  3. .connectTimeout(10, TimeUnit.SECONDS)   
  4. .writeTimeout(60, TimeUnit.SECONDS)   
  5. .build();  
 
 
 
 

 

 

为什么要突出这样的变化,和Builder为什么还要把包名的前缀一起写出来尼,主要就是因为OKhttp3中有很多不同类型的Builder,为了后面可以更好的和Map<K, V>结合起来,所以才这么写的

 

[java]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
  1. Request request = new Request.Builder()    
  2.            .url("")    
  3.            .post()    
  4.            .addHeader("", "")  
  5.            .build();    

 

在我现在公司的项目中,我们的接口请求,不管是get还是post,在请求的时候是要用到请求头的,也就是上面 addHeader("", ""),而且还是不止一个请求头,如果像上面那么写的话,那样就很难和Map<K, V>结合起来,所以用写了下面这样的一个方法

 

 

[java]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
  1.        /** 
  2.  * 设置请求头 
  3.  * @param headersParams 
  4.  * @return 
  5.  */  
  6. private Headers SetHeaders(Map<String, String> headersParams){  
  7.     Headers headers=null;  
  8.     okhttp3.Headers.Builder headersbuilder=new okhttp3.Headers.Builder();  
  9.       
  10.     if(headersParams != null)  
  11.     {  
  12.         Iterator<String> iterator = headersParams.keySet().iterator();  
  13.         String key = "";  
  14.         while (iterator.hasNext()) {  
  15.             key = iterator.next().toString();  
  16.             headersbuilder.add(key, headersParams.get(key));  
  17.             Log.d("get http", "get_headers==="+key+"===="+headersParams.get(key));  
  18.         }  
  19.     }  
  20.     headers=headersbuilder.build();  
  21.       
  22.     return headers;  
  23. }  


其中返回的headers其实就是okhttp3提供的okhttp3.Headers,而这个headers是怎么用的尼?其实OKhttp提供添加请求头的方法中,

 

不止有header("","")和addHeader("","")这两个方法,其实还有一个headers()!有了headers(),前面的header("","")和addHeader("","")这两个方法这两个方法就可以不用了。

同时注意了,这个Builder和最上面的Builder不是同一个类型的,所以在后面的代码中,每一个Builder都是把前面的包名也一起写出来的

 

[java]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
  1. Request request = new Request.Builder()    
  2.             .url("")    
  3.             .post()   
  4.             .headers(把上面的SetHeaders()方法返回的headers放到这里就行).build();    

 

 

那么,有了上面OKhttp3中添加请求头的方法了,那后面的RequestBody那也就是也一样有的喽,所以下面就写了两个post的方法

第一个:

 

[java]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
  1. /** 
  2.      * post请求参数 
  3.      * @param BodyParams 
  4.      * @return 
  5.      */  
  6.     private RequestBody SetRequestBody(Map<String, String> BodyParams){  
  7.         RequestBody body=null;  
  8.         okhttp3.FormBody.Builde formEncodingBuilder=new okhttp3.FormBody.Builder();  
  9.         if(BodyParams != null){  
  10.             Iterator<String> iterator = BodyParams.keySet().iterator();  
  11.             String key = "";  
  12.             while (iterator.hasNext()) {  
  13.                 key = iterator.next().toString();  
  14.                 formEncodingBuilder.add(key, BodyParams.get(key));  
  15.                 Log.d("post http", "post_Params==="+key+"===="+BodyParams.get(key));  
  16.             }  
  17.         }  
  18.         body=formEncodingBuilder.build();  
  19.         return body;  
  20.           
  21.     }  


第二个是用来上传图片的:

 

 

[java]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
  1.      /** 
  2.  * Post上传图片的参数 
  3.  * @param BodyParams 
  4.  * @param fileParams 
  5.  * @return 
  6.  */  
  7. private RequestBody SetFileRequestBody(Map<String, String> BodyParams,Map<String, String> fileParams){  
  8.     //带文件的Post参数  
  9.     RequestBody body=null;  
  10.     <span style="color:#ff0000;">okhttp3.MultipartBody.Builder</span> MultipartBodyBuilder=new okhttp3.MultipartBody.Builder();  
  11.     MultipartBodyBuilder.setType(MultipartBody.FORM);  
  12.     RequestBody fileBody = null;  
  13.   
  14.        if(BodyParams != null){  
  15.         Iterator<String> iterator = BodyParams.keySet().iterator();  
  16.         String key = "";  
  17.         while (iterator.hasNext()) {  
  18.             key = iterator.next().toString();  
  19.             MultipartBodyBuilder.addFormDataPart(key, BodyParams.get(key));  
  20.             Log.d("post http", "post_Params==="+key+"===="+BodyParams.get(key));  
  21.         }  
  22.        }  
  23.          
  24.     if(fileParams != null){  
  25.         Iterator<String> iterator = fileParams.keySet().iterator();  
  26.         String key = "";  
  27.         int i=0;  
  28.         while (iterator.hasNext()) {  
  29.             key = iterator.next().toString();  
  30.             i++;  
  31.             MultipartBodyBuilder.addFormDataPart(key, fileParams.get(key));  
  32.             Log.d("post http", "post_Params==="+key+"===="+fileParams.get(key));  
  33.             fileBody = RequestBody.create(HttpVariable.Media_Type.MEDIA_TYPE_PNG, new File(fileParams.get(key)));  
  34.             MultipartBodyBuilder.addFormDataPart(key, i+".png", fileBody);  
  35.         }  
  36.     }  
  37.       
  38.       
  39.       
  40.     body=MultipartBodyBuilder.build();  
  41.     return body;  
  42.       
  43. }  


当然,还有一个最简单的get的连接拼接方法了

 

 

[java]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
  1. /** 
  2.      * get方法连接拼加参数 
  3.      * @param mapParams 
  4.      * @return 
  5.      */  
  6.     private String setUrlParams( Map<String, String> mapParams){  
  7.         String strParams = "";   
  8.         if(mapParams != null){  
  9.             Iterator<String> iterator = mapParams.keySet().iterator();  
  10.             String key = "";  
  11.             while (iterator.hasNext()) {  
  12.                 key = iterator.next().toString();  
  13.                 strParams += "&"+ key + "=" + mapParams.get(key);  
  14.             }  
  15.         }     
  16.           
  17.         return strParams;  
  18.     }  



 

参数和Map<K, V>结合的问题已经解决啦,后面的就是接口数据的问题了,我一般用的json解析工具是gson,所以我写了5个方法来为我以后调用。

第一个是get的调用,调用成功后会自动用gson把返回的json解析成一个实体类的Bean,下面就是这个方法的代码,后面还有调用的方法

 

[java]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
  1.     /** 
  2. * get方法获取实体bean 
  3. * @param reqUrl UR连接 
  4. * @param headersParams 请求头参数 
  5. * @param params 请求参数 
  6. * @param object 标签 
  7. * @param mHandler  
  8. * @param rspClass 实体类 执行命令获取指定结构 rspClass : 所需转出的结构,例:UserBean.class 
  9. */  
  10. ublic void getBeanExecute(String reqUrl,  Map<String, String> headersParams, Map<String, String> params,  
  11.     Object object,final Handler mHandler, final Class<?> rspClass){  
  12.   
  13. okhttp3.Request.Builder RequestBuilder=new okhttp3.Request.Builder();  
  14. RequestBuilder.url(reqUrl+setUrlParams(params));//添加URL地址  
  15. RequestBuilder.headers(SetHeaders(headersParams));//添加请求头  
  16. RequestBuilder.tag(object);//添加请求标签  
  17. Request request=RequestBuilder.build();  
  18. Log.d("get http", "get_url==="+request.url());  
  19.   
  20.   
  21. Call call = mOkHttpClient.newCall(request);  
  22. call.enqueue(new Callback() {  
  23.     @Override  
  24.     public void onFailure(Call arg0, IOException arg1) {  
  25.         // TODO Auto-generated method stub  
  26.         Log.d("get http", "get_onFailure==="+arg1.toString());  
  27.         Message mess = mHandler.obtainMessage();//  
  28.         mess.what = 404;  
  29.         mess.obj = "通讯错误-020";  
  30.         mHandler.sendMessage(mess);  
  31.     }  
  32.   
  33.     @Override  
  34.     public void onResponse(Call arg0, Response arg1) throws IOException {  
  35.         // TODO Auto-generated method stub  
  36.         Log.d("get http", "get_code==="+arg1.code());  
  37.         String Result = "";  
  38.         Message mess = mHandler.obtainMessage();  
  39.         if (arg1.code() == 200) {  
  40.             Result = arg1.body().string();  
  41.             Log.d("get http", "get==="+Result);  
  42.             try {  
  43.                 Gson gson = new Gson();  
  44.                 // 转换返回结果信息  
  45.                 JsonBean jsonBean = new JsonBean();  
  46.                 JSONObject jsonObject = new JSONObject(Result.toString());  
  47.                 jsonBean.setMsg(jsonObject.optString("msg"));  
  48.                 jsonBean.setCode(jsonObject.optString("code"));  
  49.                 String strData = "";  
  50.                 Object dataBean = null;  
  51.                 if (jsonBean.getCode().equals(HttpVariable.ERROR_CODE.SUCCESS)) {  
  52.                     jsonBean.setResult(jsonObject.optString("result"));  
  53.                     if (!TextUtils.isEmpty(jsonBean.getResult())) {  
  54.                         if (jsonBean.getResult().substring(0, 1).equals("[")) {  
  55.                             String srt = jsonBean.getResult();  
  56.                             strData = srt.substring(1, srt.length() - 1);  
  57.                         } else {  
  58.                             strData = jsonBean.getResult();  
  59.                         }  
  60.                     }  
  61.                     dataBean = rspClass.newInstance();  
  62.                     if (!TextUtils.isEmpty(strData)) {  
  63.                         dataBean = gson.fromJson(strData, rspClass);  
  64.                     }  
  65.                 }  
  66.   
  67.                 if (jsonBean.getCode().equals(HttpVariable.ERROR_CODE.SUCCESS)) {  
  68.                     mess.what = Integer.valueOf(jsonBean.getCode());  
  69.                     if (!TextUtils.isEmpty(strData)) {  
  70.                         mess.obj = dataBean;  
  71.                     } else {  
  72.                         mess.obj = jsonBean.getMsg();  
  73.                     }  
  74.                 } else {  
  75.                     mess.what = Integer.valueOf(jsonBean.getCode());  
  76.                     mess.obj = jsonBean.getMsg();  
  77.                 }  
  78.             } catch (Exception e) {  
  79.                 mess.what = 404;  
  80.                 mess.obj = "数据异常-021";  
  81.             }  
  82.         } else {  
  83.             mess.what = arg1.code();  
  84.             mess.obj = "通讯异常-"+arg1.code();  
  85.         }  
  86.         mHandler.sendMessage(mess);  
  87.     }  
  88. });  

 

 

{"code":"0","msg":"成功","result":{"aqi":39,"area":"广州","pm2_5":22,"quality":"优","weather":"晴","temperature_min":"21","temperature_max":"31"}}

这是接口拿到的数据

看到这样的数据结构,我就会先建一个wrather的实体类bean

 

[java]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
  1. import java.io.Serializable;  
  2.   
  3. /** 
  4.  * 天气Bean 
  5.  * @author Kevin 
  6.  * 
  7.  */  
  8. public class WeatherBean implements Serializable{  
  9.       
  10.     private static final long serialVersionUID = 1L;  
  11.       
  12.     /** 
  13.      *  aqi 空气质量指数 字符串      
  14.         area 区域 字符串      
  15.         pm2_5 pm2.5        
  16.         quality 空气质量        
  17.         level 空气质量等级        
  18.         weather 天气描述        
  19.         temperature_now 当前温度        
  20.         temperature_min 最低温度        
  21.         temperature_max 最高温度    
  22.      */  
  23.       
  24.     private String aqi;  
  25.     private String area;  
  26.     private String pm2_5;  
  27.     private String quality;  
  28.     private String level;  
  29.     private String weather;  
  30.     private String temperature_now;  
  31.     private String temperature_min;  
  32.     private String temperature_max;  
  33.       
  34.       
  35.     public String getAqi() {  
  36.         return aqi;  
  37.     }  
  38.     public void setAqi(String aqi) {  
  39.         this.aqi = aqi;  
  40.     }  
  41.     public String getArea() {  
  42.         return area;  
  43.     }  
  44.     public void setArea(String area) {  
  45.         this.area = area;  
  46.     }  
  47.     public String getPm2_5() {  
  48.         return pm2_5;  
  49.     }  
  50.     public void setPm2_5(String pm2_5) {  
  51.         this.pm2_5 = pm2_5;  
  52.     }  
  53.     public String getQuality() {  
  54.         return quality;  
  55.     }  
  56.     public void setQuality(String quality) {  
  57.         this.quality = quality;  
  58.     }  
  59.     public String getLevel() {  
  60.         return level;  
  61.     }  
  62.     public void setLevel(String level) {  
  63.         this.level = level;  
  64.     }  
  65.     public String getWeather() {  
  66.         return weather;  
  67.     }  
  68.     public void setWeather(String weather) {  
  69.         this.weather = weather;  
  70.     }  
  71.     public String getTemperature_now() {  
  72.         return temperature_now;  
  73.     }  
  74.     public void setTemperature_now(String temperature_now) {  
  75.         this.temperature_now = temperature_now;  
  76.     }  
  77.     public String getTemperature_min() {  
  78.         return temperature_min;  
  79.     }  
  80.     public void setTemperature_min(String temperature_min) {  
  81.         this.temperature_min = temperature_min;  
  82.     }  
  83.     public String getTemperature_max() {  
  84.         return temperature_max;  
  85.     }  
  86.     public void setTemperature_max(String temperature_max) {  
  87.         this.temperature_max = temperature_max;  
  88.     }  
  89.       
  90. }  


调用的方法如下:

 

 

[html]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
  1. //这里可以写在单独一个接口类里面,在Activity中直接用一行代码来调用这个方法,这样就不会把代码复杂货  
[html]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
  1. Map<String, Stringheadersdatas = new HashMap<String, String>();//这里是添加你的请求头参数  
  2.         headersdatas.put("", "");  
  3.         headersdatas.put("", "");  
  4.         headersdatas.put("", "");  
  5.           
  6.           
  7. Map<String, Stringdatas = new HashMap<String, String>();//这里是拼接的请求参数  
  8.         datas.put("", "");  
  9.         datas.put("", "");  
  10.         datas.put("", "");        
  11.           
  12. OkHttpUtils.getInstance().getBeanExecute("你的接口url", headersdatas, datas,this, mHandler,WeatherBeanclass);  
[html]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
    1. /**  
    2.      * 获取天气信息  
    3.      */  
    4.     private Handler mHandler=new Handler(){  
    5.         @Override  
    6.         public void handleMessage(Message msg) {  
    7.             // TODO Auto-generated method stub  
    8.             if (msg.what==0) {//请求成功  
    9.                 try {   
    10.                     WeatherBean weatherBean=new WeatherBean();  
    11.                     weatherBean=(WeatherBean) msg.obj;//拿到接口返回的天气的实体类  
    12.                     .....//这里省略的代码就是数据拿到后操作UI部分  
    13.                 } catch (Exception e) {  
    14.                     // TODO: handle exception  
    15.                 }  
    16.             }else{  
    17.                 LogOut.showToast(getApplicationContext(), (String) msg.obj);  
    18.             }  
    19.         }  
    20.     };  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值