RetrofitUtils使用

来源:互联网 发布:益生菌 知乎 编辑:程序博客网 时间:2024/06/05 19:04

PS:如果觉得文章太长,你也可观看该课程的视频教程,亲,里面还有高清,无码的福利喔

写在前面: 
Retrofit与okhttp共同出自于Square公司,是目前市场上使用最多的联网框架,retrofit是对okhttp做了一层封装,不过封装之后的retrofit上手还是极其复杂,为了解决使用难度问题,本文推荐使用github开源项目RetrofitUtils.

RetrofitUtils开源项目地址:https://github.com/open-android/RetrofitUtils 
定义我们请求的Api,我们假设是这样的: 
http://www.oschina.net/action/apiv2/banner?catalog=1 
返回服务器的数据

{      "code": 1,      "message": "success",      "result": {      "items": [          {          "detail": "",          "href": "http://www.oschina.net/news/79650/2017-top-programming-languages",          "id": 79650,          "img": "https://static.oschina.net/uploads/cooperation/75410/google-beta-natural-language-api_048424e4-a8c3-41e8-91ef-aa009e3fc559.jpg",          "name": "2017 年热门编程语言排行榜",          "pubDate": "2016-12-06 11:51:24",          "type": 6          },          {          "detail": "",          "href": "https://www.oschina.net/question/2720166_2210842",          "id": 2210842,          "img": "https://static.oschina.net/uploads/cooperation/75323/ubuntu-forum-black-sql_eb9137ea-efb2-49aa-99fd-025a221dcfe7.jpg",          "name": "高手问答 | MySQL 开发和运维规范",          "pubDate": "2016-12-06 15:48:10",          "type": 2          },          {          "detail": "",          "href": "http://www.oschina.net/news/79757/tiobe-12",          "id": 79757,          "img": "https://static.oschina.net/uploads/cooperation/78083/chrome55-save-at-least-35-percent-memory_70ceba24-eb96-4710-99ec-c1cb5a26a3d6.jpg",          "name": "C 语言为何一蹶不振?",          "pubDate": "2016-12-08 15:18:20",          "type": 6          },          {          "detail": "",          "href": "https://www.oschina.net/news/79732/firebug-stop-develope-and-maintain",          "id": 79732,          "img": "https://static.oschina.net/uploads/cooperation/77929/top-income-programming-languages-2016_16e9be1b-2a6b-453f-bafa-442fd043024b.jpg",          "name": "Firebug 宣布不再维护,讲不出再见!",          "pubDate": "2016-12-08 10:56:47",          "type": 6          },          {          "detail": "",          "href": "http://www.oschina.net/news/79673/the-founder-of-cm-was-fired",          "id": 79673,          "img": "https://static.oschina.net/uploads/cooperation/78455/intellij-idea-2016-3-public-preview_63725513-45e4-4fb2-a0bf-c7940a7a87bc.jpg",          "name": "Cyanogen 之父被踢出局",          "pubDate": "2016-12-06 11:48:43",          "type": 6          }  ],      "nextPageToken": "61AF0C190D6BD629",      "prevPageToken": "3EA621243546C8A5",      "requestCount": 5,      "responseCount": 5,      "totalResults": 5      },      "time": "2016-12-13 10:56:41"  }  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59

这样一个接口我看看使用RetrofitUtils该如何使用 
这里写图片描述

大家看简单实用只需要new一个request然后发送一个send请求,就能返回服务器的数据,并且压根不需要解析拿到的直接就是各位需要的bean对象.
那么我们来看看RetrofitUtils的使用步骤

1.在project的build.gradle添加如下代码(如下图)

这里写图片描述

2.引入当前项目

compile 'com.github.open-android:RetrofitUtils:0.1.9'
  • 1
  • 1

3.在清单文件添加如下权限

<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

4.新建Application类并且在oncreate方法当中进行初始化: 
千万注意Application记得在manifest.xml中注册。

ItheimaHttp.init(this, Urls.getBaseUrl());
  • 1
  • 1

eg:请求地址:http://www.oschina.net/action/apiv2/banner?catalog=1 
那么baseUrl = http://www.oschina.net 
RetrofitUtils内部封装了如下使用方法

看一个完整Get和Post请求是如何实现:异步请求(内部使用Gson解析json数据)直接返回实体bean对象

Request request = ItheimaHttp.newGetRequest(apiUrl);//apiUrl格式:"xxx/xxxxx"  Call call = ItheimaHttp.send(request, new HttpResponseListener<Bean>() {      @Override      public void onResponse(Bean bean) {          ........      }       /**      * 可以不重写失败回调      * @param call      * @param e      */      @Override      public void onFailure(Call<ResponseBody> call, Throwable e) {          ......      }  });  @param httpResponseListener 回调监听  @param <T> Bean  @return Call可以取消网络请求</span>  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

添加请求参数

request.putParams(key,value)  .putParams(key,value)  .putParams(key,value);  Map<String,Object> map = new HashMap<>();  map.put(key,value);  request.putParamsMap(map);  `
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

添加请求头

request.putHeader(key,value)  .putHeader(key,value);
  • 1
  • 2
  • 1
  • 2

如果不需要RetrofitUtils框架自动解析json,那么可以使用如下请求

Call call = ItheimaHttp.getAsync(apiUrl, new HttpResponseListener<String>);  Call call = ItheimaHttp.postAsync(apiUrl, new HttpResponseListener<String>() {      @Override      public void onResponse(String s) {          ........      }  });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

如果需要RetrofitUtils框架自动解析json,直接获取javabean,那么可以使用如下请求

Call call = ItheimaHttp.getAsync(apiUrl, new HttpResponseListener<Bean>);  Call call = ItheimaHttp.postAsync(apiUrl, new HttpResponseListener<Bean>() {      @Override      public void onResponse(Bean bean) {          ........      }  });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

文件上传

Request request = ItheimaHttp.newUploadRequest("http://xxx/xxx/xxx", RequestMethod.POST);  request.putUploadFile(uploadFile)          .putMediaType(MediaType.parse("multipart/form-data"));  ItheimaHttp.upload(request, new UploadListener() {      @Override      public void onResponse(Call call, Response response) {          //上传成功回调      }      @Override      public void onProgress(long progress, long total, boolean done) {          //上传进度回调progress:上传进度,total:文件长度, done:上传是否完成      }      @Override      public void onFailure(Call call, Throwable t) {          //上传失败      }  });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

取消网络请求

call.cancel();