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

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

okhttp-3.2.0和okio-1.7.0就不多说

首先建一个OkHttpUtils的类

  1. /**
  2. * HTTP通讯结构处理器
  3. *
  4. */
  5. public class OkHttpUtils {
  6. private static final byte[] LOCKER = new byte[0];
  7. private static OkHttpUtils mInstance;
  8. private OkHttpClient mOkHttpClient;
  9. private OkHttpUtils() {
  10. okhttp3.OkHttpClient.Builder ClientBuilder=new okhttp3.OkHttpClient.Builder();
  11. ClientBuilder.readTimeout(30, TimeUnit.SECONDS);//读取超时
  12. ClientBuilder.connectTimeout(10, TimeUnit.SECONDS);//连接超时
  13. ClientBuilder.writeTimeout(60, TimeUnit.SECONDS);//写入超时
  14. mOkHttpClient=ClientBuilder.build();
  15. }
  16. public static OkHttpUtils getInstance() {
  17. if (mInstance == null) {
  18. synchronized (LOCKER) {
  19. if (mInstance == null) {
  20. mInstance = new OkHttpUtils();
  21. }
  22. }
  23. }
  24. return mInstance;
  25. }

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

  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>结合起来,所以才这么写的

  1. Request request = new Request.Builder()
  2. .url("")
  3. .post()
  4. .addHeader("", "")
  5. .build();

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

  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. if(headersParams != null)
  10. {
  11. Iterator<String> iterator = headersParams.keySet().iterator();
  12. String key = "";
  13. while (iterator.hasNext()) {
  14. key = iterator.next().toString();
  15. headersbuilder.add(key, headersParams.get(key));
  16. Log.d("get http", "get_headers==="+key+"===="+headersParams.get(key));
  17. }
  18. }
  19. headers=headersbuilder.build();
  20. return headers;
  21. }

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

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

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

  1. Request request = new Request.Builder()
  2. .url("")
  3. .post()
  4. .headers(把上面的SetHeaders()方法返回的headers放到这里就行).build();

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

第一个:

  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. }

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

  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. if(BodyParams != null){
  14. Iterator<String> iterator = BodyParams.keySet().iterator();
  15. String key = "";
  16. while (iterator.hasNext()) {
  17. key = iterator.next().toString();
  18. MultipartBodyBuilder.addFormDataPart(key, BodyParams.get(key));
  19. Log.d("post http", "post_Params==="+key+"===="+BodyParams.get(key));
  20. }
  21. }
  22. if(fileParams != null){
  23. Iterator<String> iterator = fileParams.keySet().iterator();
  24. String key = "";
  25. int i=0;
  26. while (iterator.hasNext()) {
  27. key = iterator.next().toString();
  28. i++;
  29. MultipartBodyBuilder.addFormDataPart(key, fileParams.get(key));
  30. Log.d("post http", "post_Params==="+key+"===="+fileParams.get(key));
  31. fileBody = RequestBody.create(HttpVariable.Media_Type.MEDIA_TYPE_PNG, new File(fileParams.get(key)));
  32. MultipartBodyBuilder.addFormDataPart(key, i+".png", fileBody);
  33. }
  34. }
  35. body=MultipartBodyBuilder.build();
  36. return body;
  37. }

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

  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. return strParams;
  17. }

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

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

  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. okhttp3.Request.Builder RequestBuilder=new okhttp3.Request.Builder();
  13. RequestBuilder.url(reqUrl+setUrlParams(params));//添加URL地址
  14. RequestBuilder.headers(SetHeaders(headersParams));//添加请求头
  15. RequestBuilder.tag(object);//添加请求标签
  16. Request request=RequestBuilder.build();
  17. Log.d("get http", "get_url==="+request.url());
  18. Call call = mOkHttpClient.newCall(request);
  19. call.enqueue(new Callback() {
  20. @Override
  21. public void onFailure(Call arg0, IOException arg1) {
  22. // TODO Auto-generated method stub
  23. Log.d("get http", "get_onFailure==="+arg1.toString());
  24. Message mess = mHandler.obtainMessage();//
  25. mess.what = 404;
  26. mess.obj = "通讯错误-020";
  27. mHandler.sendMessage(mess);
  28. }
  29. @Override
  30. public void onResponse(Call arg0, Response arg1) throws IOException {
  31. // TODO Auto-generated method stub
  32. Log.d("get http", "get_code==="+arg1.code());
  33. String Result = "";
  34. Message mess = mHandler.obtainMessage();
  35. if (arg1.code() == 200) {
  36. Result = arg1.body().string();
  37. Log.d("get http", "get==="+Result);
  38. try {
  39. Gson gson = new Gson();
  40. // 转换返回结果信息
  41. JsonBean jsonBean = new JsonBean();
  42. JSONObject jsonObject = new JSONObject(Result.toString());
  43. jsonBean.setMsg(jsonObject.optString("msg"));
  44. jsonBean.setCode(jsonObject.optString("code"));
  45. String strData = "";
  46. Object dataBean = null;
  47. if (jsonBean.getCode().equals(HttpVariable.ERROR_CODE.SUCCESS)) {
  48. jsonBean.setResult(jsonObject.optString("result"));
  49. if (!TextUtils.isEmpty(jsonBean.getResult())) {
  50. if (jsonBean.getResult().substring(0, 1).equals("[")) {
  51. String srt = jsonBean.getResult();
  52. strData = srt.substring(1, srt.length() - 1);
  53. } else {
  54. strData = jsonBean.getResult();
  55. }
  56. }
  57. dataBean = rspClass.newInstance();
  58. if (!TextUtils.isEmpty(strData)) {
  59. dataBean = gson.fromJson(strData, rspClass);
  60. }
  61. }
  62. if (jsonBean.getCode().equals(HttpVariable.ERROR_CODE.SUCCESS)) {
  63. mess.what = Integer.valueOf(jsonBean.getCode());
  64. if (!TextUtils.isEmpty(strData)) {
  65. mess.obj = dataBean;
  66. } else {
  67. mess.obj = jsonBean.getMsg();
  68. }
  69. } else {
  70. mess.what = Integer.valueOf(jsonBean.getCode());
  71. mess.obj = jsonBean.getMsg();
  72. }
  73. } catch (Exception e) {
  74. mess.what = 404;
  75. mess.obj = "数据异常-021";
  76. }
  77. } else {
  78. mess.what = arg1.code();
  79. mess.obj = "通讯异常-"+arg1.code();
  80. }
  81. mHandler.sendMessage(mess);
  82. }
  83. });

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

这是接口拿到的数据

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

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

调用的方法如下:

  1. //这里可以写在单独一个接口类里面,在Activity中直接用一行代码来调用这个方法,这样就不会把代码复杂货
  1. Map<String, String> headersdatas = new HashMap<String, String>();//这里是添加你的请求头参数
  2. headersdatas.put("", "");
  3. headersdatas.put("", "");
  4. headersdatas.put("", "");
  5. Map<String, String> datas = new HashMap<String, String>();//这里是拼接的请求参数
  6. datas.put("", "");
  7. datas.put("", "");
  8. datas.put("", "");
  9. OkHttpUtils.getInstance().getBeanExecute("你的接口url", headersdatas, datas,this, mHandler,WeatherBeanclass);
    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. };

okHttp3自用封装的更多相关文章

  1. 自用封装javascript函数

    (function(){ var JHRZ_IMG_Arr = JHRZ_IMG_Arr || {}; JHRZ_IMG_Arr.loading = ["/static/images/loa ...

  2. OkHttp3 + retrofit2 封装

    0.下载文件 1.gradle 添加 compile 'com.squareup.retrofit2:retrofit:2.1.0'compile 'com.squareup.retrofit2:co ...

  3. okhttp3 get post 简单封装

    最近打算在新项目中使用 okhttp3, 简单封装了一下异步 get post 因为 CallBack 也是在子线程中执行,所以用到了 Handler public class MyOkHttpCli ...

  4. 封装OkHttp,通过Callback改造Callback实现

    1:实现Callback回调接口import android.os.Handler;import android.os.Looper;import android.os.Message;import ...

  5. 封装OkHttp,通过改造Callback接口实现

    1:实现Callback回调接口import android.os.Handler;import android.os.Looper;import android.os.Message; import ...

  6. 【Android】OkHttp3总结与封装

    开始使用 在app目录下的build.gradle中添加依赖: implementation 'com.squareup.okhttp3:okhttp:3.13.1' implementation ' ...

  7. Vue自用axios封装

    [本文出自天外归云的博客园] 这是我的Vue项目中的request.js文件,请求报错了看console就会有具体请求信息,方便调试.分享一下. 其中用到了axios和element-ui的组件,ax ...

  8. 封装自用的脚本ajax.js

    function createxmlhttp() { xmlhttpobj = false; try{//创建对象,一个一个的试,哎,要是能统一标准都好.. xmlhttpobj = new XMLH ...

  9. 如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源

    1.前言 关于微信内部正在使用的网络层封装库Mars开源的消息,1个多月前就已满天飞(参见<微信Mars:微信内部正在使用的网络层封装库,即将开源>),不过微信团队没有失约,微信Mars ...

随机推荐

  1. 在eclpse中 一个web project 引用多个 java project 的方法

    在开发时,我们会遇到一个需求:模块化.它要求我们把 业务组件进行拆分,分组.把一部分业务功能集中处理,以保证 部分功能块的独立,便于 分配任务到个人,确定人员职责,源代码管理,和发布时重组. 我们尝试 ...

  2. 【常用配置】——WPS文字常用快捷键大全【史上最全面】转

    WPS文字快捷键大全 Word快捷键 Excel快捷键 PPT快捷键 Office快捷键大全 WPS文字快捷键 WPS表格快捷键 WPS演示快捷键 WPS快捷键大全 用于处理WPS文档的快捷键 创建新 ...

  3. git 服务器新建仓库 远程仓库

    Git 服务器搭建 上一章节中我们远程仓库使用了 Github,Github 公开的项目是免费的,但是如果你不想让其他人看到你的项目就需要收费. 这时我们就需要自己搭建一台Git服务器作为私有仓库使用 ...

  4. 记录一下寄几个儿的greendao数据库升级,可以说是非常菜鸡了嗯

    之前使用的greendao数据库存储服务器所有的历史推送消息,但是后来消息需要加几个新的字段 举个栗子,比如要新增红色框住的字段到数据库中: 本仙女作为一只思想成熟的菜鸡,当然是加了字段就赶紧重新往里 ...

  5. ggplot2 pdf import in Adobe Illustrator missing font AdobePiStd

    The font AdobePiStd is missing. Affected text will be displayed using a substitute font. 缺少字体 AdobeP ...

  6. 如何通过使用窗体身份验证和 Visual C#.NET 对 Active Directory 验证身份

    本分步指南演示如何在 ASP.NET 应用程序如何使用窗体身份验证允许用户使用轻型目录访问协议 (LDAP),对 Active Directory 进行验证.经过身份验证的用户重定向之后,可以使用Ap ...

  7. 路由策略和策略路由 & route-map

    今天,这个专题应用下route-map,在这个之前,有很多内容需要掌握,不是简单的制定一个路由图就可以了. -------- 本次专题理论的东西居多,但是不是复制黏贴,是加上自己的理解思想. 第一个要 ...

  8. PCB设计与信号完整性

    之前在设计板卡时,只是听过相关的概念,但是未真正去研究关于SI相关的知识.将之前看过的一些资料整理如下: (1)信号完整性分析 与SI有关的因素:反射,串扰,辐射.反射是由于传输路径上的阻抗不匹配导致 ...

  9. chromedriver与chrome版本映射表(更新至v2.30)

    在 chrome://help/ 查看浏览器版本号 看到网上基本没有最新的chromedriver与chrome的对应关系表,便兴起整理了一份如下,希望对大家有用: chromedriver版本 支持 ...

  10. ubuntu -- 安装memcached

    Memcached的安装依赖libevent.它是memcached所依赖的异步事件通知库,因此在安装memcached之前先要安装libevent. ubuntu安装软件的方法通常有两种 第一种:使 ...