[原创]Retrofit使用教程(一)

news/2024/7/5 20:31:50 标签: json, java

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

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

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

集成

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

    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返回的数据格式如下:

json">{
    "errNum": 0,
    "retMsg": "success",
    "retData": {
        "phone": "15210011578",
        "prefix": "1521001",
        "supplier": "移动",
        "province": "北京",
        "city": "北京",
        "suit": "152卡"
    }
}

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

java">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">public interface GitHubService {
  @GET("users/{user}/repos")
  Call<List<Repo>> listRepos(@Path("user") String user);
}

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

java">public interface PhoneService {
    @GET("")
    Call<PhoneResult> getResult();
}

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

java">public interface PhoneService {
    @GET("/apistore/mobilenumber/mobilenumber")
    Call<PhoneResult> getResult(@Header("apikey") String apikey, @Query("phone") String phone);
}

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

  • @Header用来添加Header

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

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

java">public interface PhoneService {
    @GET("/apistore/mobilenumber/mobilenumber")
    Call<PhoneResult> getResult(@Header("apikey") String apikey, @Query("phone") String phone);
}

使用

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

使用分为四步:

  1. 创建Retrofit对象

  2. 创建访问API的请求

  3. 发送请求

  4. 处理结果

代码如下所示:

java">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) {

        }
    });
}

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

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

验证

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

编译APP,安装到手机,界面如下:

APP界面

输入手机号码,然后点击查询按钮,结果如下:

结果界面

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

更多文章请访问我的博客:DevWiki Blog


http://www.niftyadmin.cn/n/1796721.html

相关文章

内蒙古自治区呼和浩特市谷歌高清卫星地图下载

一、概述   呼和浩特&#xff0c;通称呼市&#xff0c;旧称归绥&#xff0c;是内蒙古自治区首府和政治、经济、文化中心&#xff0c;国家历史文化名城&#xff0c;我国北方沿边地区重要的中心城市 。地处中国北部边疆&#xff0c;欧亚大陆内部。   呼和浩特有着悠久的历史和…

C++ STL(第十五篇:hashtable)

1、hashtable hashtable 的目的是为了提供任何操作都是常数级别。SGI STL 中&#xff0c; hash table 使用了 开链法 实现的。大致的意思如下图所示&#xff1a; hash table 内的元素为 桶子&#xff08;bucket&#xff09;&#xff0c;每个桶子里面有很多节点。其实有点像我…

内蒙古自治区阿拉善盟谷歌高清卫星地图下载

一、概述   阿拉善盟是内蒙古自治区所辖盟&#xff0c;阿拉善盟位于内蒙古自治区最西部&#xff0c;地处呼包银经济带、陇海兰新经济带交汇处&#xff0c;东与巴彦淖尔市、乌海市、鄂尔多斯市相连&#xff0c;南与宁夏回族自治区毗邻&#xff0c;西与甘肃省接壤&#xff0c;北…

异常处理點滴

异常处理重要 l 捕获异常&#xff0c;写Log方便开发人和维护人追踪错误。 l 抛出友好&#xff0c;明确&#xff0c;用户能明白的信息。 方法一 1 自定义异常 Public Class MyException Inherits ArgumentException Public Sub New(ByVal message As [String]…

Elasticsearch 搜索服务器全集群升级版本并重启

2019独角兽企业重金招聘Python工程师标准>>> Elasticsearch 搜索服务器需要一个完整的集群重启&#xff0c;主要版本升级是从0.X至1.x或从1.x的2.x版本到滚动升级不能超过该界限版本的支持。 这个过程要一个完整的集群重启进行升级&#xff0c;如下所示&#xff1a;…

内蒙古自治区呼伦贝尔市谷歌高清卫星地图下载

一、概述   呼伦贝尔市&#xff08;Hulunbuir&#xff09;&#xff0c;内蒙古自治区下辖地级市&#xff0c;以境内呼伦湖和贝尔湖得名。东邻黑龙江省&#xff0c;西、北与蒙古国、俄罗斯相接壤&#xff0c;是中俄蒙三国的交界地带&#xff0c;与俄罗斯、蒙古国有1733公里的边…

C++ STL(第十六篇:容器的总结)

1、总结 到这里&#xff0c;对于STL的容器就整理完成了。我们把容器分为了 序列式容器 和 关联式容器&#xff0c;而每类下面又分为好多容器&#xff0c;如下图所示&#xff1a; 其中&#xff0c;有一些容器需要基于特定的结构或算法&#xff0c;如 priority-queue&#xff0…

将.sql文件中的数据库结构和数据存储入数据库中

2019独角兽企业重金招聘Python工程师标准>>> 将projectgo.sql文件中的数据库结构和数据存储入数据库中&#xff1a; 1、先创建数据库projectgo create database projectgo; 2、切换到数据库projectgo下&#xff0c; use projectgo; 3、将projectgo.sql中的数据…