继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Android Retrofit使用教程

天涯尽头无女友
关注TA
已关注
手记 85
粉丝 9
获赞 42

Square公司开源了许多优秀的库,Retrofit就是其中之一。

Retrofit是用来简化APP访问服务器API,如果你的服务器使用的使RESTAPI,那么赶紧使用Retrofit吧。

官方的文档是用GitHub的API说明使用过程的,有的童鞋可能从没用过GitHub的API(比如我),为了简单易懂,这里我使用一个查询手机归属地的API来说明Retrofit的使用过程。

集成

目前我使用的是AndroidStudio,那么在model的build.gradle文件中添加以下引用:

[代码]xml代码:

?

1

2

3

4

compile 'com.squareup.okhttp3:okhttp:3.2.0'

compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'

compile 'com.google.code.gson:gson:2.6.2'

compile 'com.jakewharton:butterknife:7.0.1'

 

说明:

·         Retrofit依赖于okhttp,所以需要集成okhttp

·         API返回的数据为JSON格式,在此我使用的是Gson对返回数据解析.请使用最新版的Gson

·         butterknife是用来View绑定的,可以不用写那些烦人的findViewById了

返回的数据格式

使用的是百度的API Store提供的API,地址在此:手机号码归属地__API服务_API服务_API Store.


该接口的API主机地址为:http://apis.baidu.com,资源地址为:/apistore/mobilenumber/mobilenumber
需要一个key等于apikey的Header和一个key等于phone的查询关键字,而且该请求为GET请求.

所以我们需要构造一个GET请求,添加一个Header,添加一个Query关键字,访问该API返回的数据格式如下:

{

    "errNum": 0,

    "retMsg": "success",

    "retData": {

        "phone": "15210011578",

        "prefix": "1521001",

        "supplier": "移动",

        "province": "北京",

        "city": "北京",

        "suit": "152卡"

    }

}

根据返回结果我们创建数据对象PhoneResult,如下:

[代码]java代码:

?

01

02

03

04

05

06

07

08

09

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

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

public class PhoneResult {

    /**

     * errNum : 0

     * retMsg : success

     * retData :   {"phone":"15210011578","prefix":"1521001","supplier":"移动","province":"北京","city":"北京","suit":"152卡"}

     */

    private int errNum;

    private String retMsg;

    /**

     * phone : 15210011578

     * prefix : 1521001

     * supplier : 移动

     * province : 北京

     * city : 北京

     * suit : 152卡

     */

    private RetDataEntity retData;

  

    public void setErrNum(int errNum)   {

        this.errNum   = errNum;

    }

  

    public void setRetMsg(String   retMsg) {

        this.retMsg   = retMsg;

    }

  

    public void setRetData(RetDataEntity   retData) {

        this.retData   = retData;

    }

  

    public int getErrNum() {

        return errNum;

    }

  

    public String getRetMsg() {

        return retMsg;

    }

  

    public RetDataEntity   getRetData() {

        return retData;

    }

  

    public static class RetDataEntity   {

        private   String phone;

        private   String prefix;

        private   String supplier;

        private   String province;

        private   String city;

        private   String suit;

  

        public void   setPhone(String phone) {

            this.phone   = phone;

        }

  

        public void   setPrefix(String prefix) {

            this.prefix   = prefix;

        }

  

        public void   setSupplier(String supplier) {

            this.supplier   = supplier;

        }

  

        public void   setProvince(String province) {

            this.province   = province;

        }

  

        public void   setCity(String city) {

            this.city   = city;

        }

  

        public void   setSuit(String suit) {

            this.suit   = suit;

        }

  

        public String   getPhone() {

            return   phone;

        }

  

        public String   getPrefix() {

            return   prefix;

        }

  

        public String   getSupplier() {

            return   supplier;

        }

  

        public String   getProvince() {

            return   province;

        }

  

        public String   getCity() {

            return   city;

        }

  

        public String   getSuit() {

            return   suit;

        }

    }

}

 

注:AndroidStudio有个插件 GsonFormat可以很方便地将Json数据转为Java对象.

实现过程

构建

首先,按照官方的说明,我们需要创建一个接口,返回Call<PhoneResult>

官方范例:

[代码]java代码:

?

1

2

3

4

public interface GitHubService {

  @GET("users/{user}/repos")

  Call<list<repo>>   listRepos(@Path("user") String user);

}</list<repo>

 

这里我们创建一个名为PhoneService的接口,返回值为Call<PhoneResult>,如下:

[代码]java代码:

?

1

2

3

4

public interface PhoneService {

    @GET("")

    Call<phoneresult>   getResult();

}</phoneresult>

 

首先我们需要填写API的相对地址:/apistore/mobilenumber/mobilenumber

[代码]java代码:

?

1

2

3

4

public interface PhoneService {

    @GET("/apistore/mobilenumber/mobilenumber")

    Call<phoneresult>   getResult(@Header("apikey") String apikey,   @Query("phone") String phone);

}</phoneresult>

 

接着我们要添加一个Header和一个Query关键字,在这里我们需要使用Retrofit提供的注解:

·         @Header用来添加Header

·         @Query用来添加查询关键字

那么,我们的接口就如下了:

 

[代码]java代码:

?

1

2

3

4

public interface PhoneService {

    @GET("/apistore/mobilenumber/mobilenumber")

    Call<phoneresult>   getResult(@Header("apikey") String apikey,   @Query("phone") String phone);

}</phoneresult>

 

使用

构建好接口以后,可以使用了!

使用分为四步:

1.   创建Retrofit对象

2.   创建访问API的请求

3.   发送请求

4.   处理结果

代码如下所示:

[代码]java代码:

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

private static final String BASE_URL =   "http://apis.baidu.com";

private static final String API_KEY =   "8e13586b86e4b7f3758ba3bd6c9c9135";

  

private void query(){

    //1.创建Retrofit对象

    Retrofit retrofit = new Retrofit.Builder()

            .addConverterFactory(GsonConverterFactory.create())//解析方法

            .baseUrl(BASE_URL)//主机地址

            .build();

  

    //2.创建访问API的请求

    PhoneService service =   retrofit.create(PhoneService.class);

    Call<phoneresult> call =   service.getResult(API_KEY, phoneView.getText().toString());

  

    //3.发送请求

    call.enqueue(new Callback<phoneresult>()   {

        @Override

        public void   onResponse(Call<phoneresult> call, Response<phoneresult>   response) {

            //4.处理结果

            if   (response.isSuccess()){

                PhoneResult   result = response.body();

                if   (result != null){

                    PhoneResult.RetDataEntity   entity = result.getRetData();

                }

            }

        }

  

        @Override

        public void   onFailure(Call<phoneresult> call, Throwable t) {

  

        }

    });

}</phoneresult></phoneresult></phoneresult></phoneresult></phoneresult>

 

可能会有疑问:第一步中的解析方法GsonConverterFactory.create()是个啥?

官方文档也说明了,这是用来转换服务器数据到对象使用的.该Demo中使用API返回的数据是JSON格式,故此使用Gson来转换,如果服务器返回的是其他类型的数据,则根据需要编写对应的解析方法.

验证

好了,现在可以验证一下了!

项目代码详见此处:Dev-Wiki/RetrofitDemo

原文链接:http://www.apkbus.com/blog-705730-61354.html

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP