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

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

okhttp-3.2.0和okio-1.7.0就不多说

首先建一个OkHttpUtils的类

[java] view plaincopy
  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的写法是不一样的。一般网上的代码是下面这样的

[java] view plaincopy
  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 plaincopy
  1. Request request = new Request.Builder()
  2. .url("")
  3. .post()
  4. .addHeader("", "")
  5. .build();

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

[java] view plaincopy
  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都是把前面的包名也一起写出来的

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

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

第一个:

[java] view plaincopy
  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. }

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

[java] view plaincopy
  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的连接拼接方法了

[java] view plaincopy
  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,下面就是这个方法的代码,后面还有调用的方法

[java] view plaincopy
  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

[java] view plaincopy
  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. }

调用的方法如下:

[html] view plaincopy
  1. //这里可以写在单独一个接口类里面,在Activity中直接用一行代码来调用这个方法,这样就不会把代码复杂货
[html] view plaincopy
  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);
[html] view plaincopy
  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. Android网络框架okhttp3简单封装

    1:在demo得build文件中添加依赖(这里以3.8.1版本为例) dependencies {compile 'com.squareup.okhttp3:okhttp:3.8.1' } 2:对网络 ...

  2. okhttp3测试框架_easy-okhttp: 这是一个对okhttp3进行封装的工具,提供了更为便捷的方法调用。目的是为了替换难用的apache HttpClient。...

    easy-okhttp 简介 项目easy-okhttp是对okhttp网络框架(https://github.com/square/okhttp)上层封装, 支持文件上传和下载,表单(含文件)提交, ...

  3. OkHttp3 + retrofit2 封装

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

  4. uniapp开发微信小程序弹窗自用封装

    /*** 提示与加载工具类*/ export default class Tips {constructor() {this.isLoading = false;}/*** 弹出提示框*/static ...

  5. Okhttp3-网络请求流程解析

    前言 已经大火2年的Retrofit,必然会提到另外两个库,OKhttp3和Rxjava,尤其前者,作为Retrofit网络请求的底层库,我们有必要了解OKhttp3的网络请求是如何运作的,就会理解为 ...

  6. 流量回放开源代码Java_流量回放框架 jvm-sandbox-repeater 的实践

    一. 前言 你是否和我一样遇到过以下的问题? 1)服务重构,一堆接口需要回归,让人头疼 2)每次迭代,都要花很多精力来进行回归测试 3)线上 bug,线下复现不了 4)接口自动化用例写辛苦,维护更辛苦 ...

  7. Retrofit2源码解析(一)

    本文基于Retrofit2的2.4.0版本 implementation 'com.squareup.retrofit2:retrofit:2.4.0' Retrofit2底层基于OkHttp3,是对 ...

  8. 流量回放框架jvm-sandbox-repeater的实践

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击http://www.captainbed.net 一. 前言 你是否和我一样遇到过以下的问题? 1)服 ...

  9. 一些有用的网址,实时更新.

    Vue.js 教程 http://www.runoob.com/vue2/vue-tutorial.html Vue.js ApI https://cn.vuejs.org/v2/api/#v-tex ...

  10. 为OkGo网络请求增加自定义log功能

    OkGo是基于Okhttp3的封装,所以只需要增加自定义拦截器就可以实现自定义log.(OkGo有一个默认的log拦截器HttpLoggingInterceptor,如果没有特别需求则无需自定义) 第 ...

最新文章

  1. echarts 弹出放大_echarts 如何让饼图hover放大效果一直显示
  2. c语言最小元素下标怎么看,查找最小的k个元素 (C语言代码)
  3. Python类及面向对象编程【转】
  4. 初中七年级上计算机试题答案,初中信息技术考试试题(含答案).docx
  5. vue问题解决 extract:echarts: sill extract echarts@^4.2.0-rc.2 extracted to
  6. vue实现结算淘宝购物车效果
  7. 使用getdate()获取不同格式的日期
  8. BottledWater-PG安装部署
  9. win10下出现.net framework 3.5错误代码0x800F081F的问题
  10. Shadowify 高级感投影photoshop/ps插件
  11. html中实现鼠标悬停放大,如何实现鼠标悬停图片放大的效果。
  12. 关于北京租房,我想吐槽的一些东西
  13. Android aab文件签名过程
  14. 分发系统苹果签名代理推广IOS15安卓苹果应用封装
  15. 金蝶显示连接云服务器异常,金蝶提示连接云服务器异常
  16. 建立高效的测试团队 (转自关河)
  17. 以太网远程MQTT IO模块在IIOT工业物联网项目中的应用
  18. 少有人知的旅游咨询虚拟暴利行业,日赚百元很简单
  19. bison使用error死循环的记录
  20. 485之隔离电源引起的问题

热门文章

  1. Google 周三宣布新版Google Trend上线
  2. c#如何取得事件注册的方法
  3. Python之print语句
  4. hibernate映射(一对一、一对多、多对一、多对多)配置 【转】
  5. .net开发微信公众号(3)-接收微信推送的消息
  6. CentOS设置默认启动命令行(不启动图形界面)
  7. easyui学习笔记5—panel加载其他的页面
  8. b树删除节点每次只能删一个吗_【面试索引】BTree、B+Tree、红黑树、B*Tree数据结构...
  9. 比特币创业公司Circle首获数字货币许可证
  10. cdn 导致跨域问题