Retrofit2.0

前言

这篇文章还是老规矩,目的很明确就是掌握用法,一些基础的语法会穿插在掌握用法的例子中,力求花最少的时间上手Retrofit2.0。

进入正题

build.gradle中添加Retrofit2.0依赖

dependencies {
    //添加依赖
    implementation 'com.squareup.retrofit2:retrofit:2.5.0'
}

添加网络权限

<uses-permission android:name="android.permission.INTERNET"/>

具体步骤(六步)

步骤1:创建接收服务器返回数据的类
步骤2:创建用于描述网络请求的接口
步骤3:创建Retrofit实例
步骤4:创建网络请求接口实例并传入网络请求参数(如果有的话,一般用在有实体请求参数的Post类请求)
步骤5:发送网络请求(异步 / 同步),实现里封装了 数据转换、线程切换的操作
步骤6: 处理服务器返回的数据

实例一:用金山词典Api通过发送Get请求的方式将英文翻译成中文
  • 准备

URL模板:http://fy.iciba.com/
请求参数:ajax.php?a=fy&f=auto&t=auto&w=hello world
完整URL:http://fy.iciba.com/ajax.php?a=fy&f=auto&t=auto&w=hello

  • 参数说明:
    a:固定值 fy。
    f:原文内容类型,日语取 ja,中文取 zh,英语取 en,韩语取 ko,德语取 de,西班牙语取 es,法语取 fr,自动则取 auto。
    t:译文内容类型,日语取 ja,中文取 zh,英语取 en,韩语取 ko,德语取 de,西班牙语取 es,法语取 fr,自动则取 auto。
    w:查询内容。
  • 请求返回结果


    image.png
步骤一、创建返回结果实体对象(Bean对象),为了看起来清晰,我就把所有get和set方法省略了
  • Translation.java
import java.util.List;

public class Translation {
    private int status;
    private Content content;

    private class Content {
        private String ph_en;
        private String ph_am;
        private String ph_en_mp3;
        private String ph_am_mp3;
        private String ph_tts_mp3;
        private List<String> word_mean;

        @Override
        public String toString() {
            return "Content{" +
                    "ph_en='" + ph_en + '\'' +
                    ", ph_am='" + ph_am + '\'' +
                    ", ph_en_mp3='" + ph_en_mp3 + '\'' +
                    ", ph_am_mp3='" + ph_am_mp3 + '\'' +
                    ", ph_tts_mp3='" + ph_tts_mp3 + '\'' +
                    ", word_mean=" + word_mean +
                    '}';
        }
    }

    @Override
    public String toString() {
        return "Translation{" +
                "status=" + status +
                ", content=" + content +
                '}';
    }
}
步骤二、创建用于描述网络请求的接口
import retrofit2.Call;
import retrofit2.http.GET;

public interface GetRequestInterface {
    //采用注解描述请求方式为GET请求
    //在注解里传入网络请求参数为ajax.php?a=fy&f=auto&t=auto&w=hello
    //Retrofit把网络请求的URL分成了两部分:一部分放在Retrofit对象里,另一部分放在网络请求接口里
    //如果接口里的url是一个完整的网址,那么放在Retrofit对象里的URL可以忽略
    @GET("ajax.php?a=fy&f=auto&t=auto&w=hello")
    //getCall()是获取网络请求的方法
    Call<Translation> getCall();
}
步骤三四五六
  • 由于此处采用了Gson 解析,所以需要在build.gradle加入依赖
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
  • MainActivity.java里面按钮点击方法,点击一次就发送一次Get请求
   public void doClick(View view) {
        //步骤3:创建Retrofit对象
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://fy.iciba.com/") // 设置网络请求 Url
                .addConverterFactory(GsonConverterFactory.create()) //设置使用Gson解析
                .build();
        // 步骤4:创建网络请求接口的实例
        GetRequestInterface request = retrofit.create(GetRequestInterface.class);
        //通过接口方法获取请求对象,里面对要发送的请求进行了封装
        Call<Translation> call = request.getCall();
        //步骤5:发送网络请求(异步)
        call.enqueue(new Callback<Translation>() {
            //请求成功时回调
            @Override
            public void onResponse(Call<Translation> call, Response<Translation> response) {
                // 步骤6:处理返回的数据结果
                Log.d("Retrofit2.0请求结果", response.body().toString());
            }

            //请求失败时回调
            @Override
            public void onFailure(Call<Translation> call, Throwable throwable) {
                Log.e("Retrofit2.0", "请求失败");
            }
        });
    }
  • 输出日志
Retrofit2.0请求结果: Translation{status=0, content=Content{ph_en='hə'ləʊ', ph_am='həˈloʊ', ph_en_mp3='', ph_am_mp3='http://res.iciba.com/resource/amp3/1/0/5d/41/5d41402abc4b2a76b9719d911017c592.mp3', ph_tts_mp3='http://res-tts.iciba.com/5/d/4/5d41402abc4b2a76b9719d911017c592.mp3', word_mean=[int. 哈喽,喂;你好,您好;表示问候;打招呼;, n. “喂”的招呼声或问候声;, vi. 喊“喂”;]}}
实例二:通过Post方式将中文翻译成英文
  • 准备

URL模板:http://fanyi.youdao.com/
请求参数:translate?doctype=json&jsonversion=&type=ZH_CN2EN&keyfrom=&model=&mid=&imei=&vendor=&screen=&ssid=&network=&abtest=
请求体:i
请求格式:x-www-form-urlencoded

  • 参数说明
    doctype:json 或 xml。
    jsonversion:如果 doctype 值是 xml,则去除该值,若 doctype 值是 json,该值为空即可。
    xmlVersion:如果 doctype 值是 json,则去除该值,若 doctype 值是 xml,该值为空即可。
    type:语言自动检测时为 null,为 null 时可为空。英译中为 EN2ZH_CN,中译英为ZH_CN2EN,日译中为 JA2ZH_CN,中译日为 ZH_CN2JA,韩译中为KR2ZH_CN,中译韩为 ZH_CN2KR,中译法为 ZH_CN2FR,法译中为FR2ZH_CN。
    keyform:mdict. + 版本号 + .手机平台。可为空。
    model:手机型号。可为空。
    mid:平台版本。可为空。
    imei:手机IMEI。可为空。
    vendor:应用下载平台。可为空。
    screen:屏幕宽高。可为空。
    ssid:用户名。可为空。
    abtest:???。可为空。
  • 请求返回结果


    image.png
  • 返回结果实体类
import java.util.List;

public class Translation {
    private String type;
    private int errorCode;
    private int elapsedTime;
    private List<List<TranslateResult>> translateResult;

    private class TranslateResult {
        private String src;
        private String tgt;

        @Override
        public String toString() {
            return "TranslateResult{" +
                    "src='" + src + '\'' +
                    ", tgt='" + tgt + '\'' +
                    '}';
        }
    }

    @Override
    public String toString() {
        return "Translation{" +
                "type='" + type + '\'' +
                ", errorCode=" + errorCode +
                ", elapsedTime=" + elapsedTime +
                ", translateResult=" + translateResult +
                '}';
    }
}
  • 创建用于描述网络请求的接口
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;

public interface PostRequestInterface {
    //采用@Post表示Post方法进行请求(传入请求参数)
    @POST("translate?doctype=json&jsonversion=&type=&keyfrom=&model=&mid=&imei=&vendor=&screen=&ssid=&network=&abtest=")
    //采用@FormUrlEncoded注解的原因:API规定采用请求格式x-www-form-urlencoded,即表单形式
    @FormUrlEncoded
    //@Field:向服务器提交实体的字段
    Call<Translation> getCall(@Field("i") String targetSentence);
}
  • 发送同步Post请求,注意同步请求要在新线程中执行,不能在UI线程中执行
   public void doClick(View view) {
        new Thread() {
            @Override
            public void run() {
                try {
                    //步骤3:创建Retrofit对象
                    Retrofit retrofit = new Retrofit.Builder()
                            .baseUrl("http://fanyi.youdao.com/") // 设置网络请求Url
                            .addConverterFactory(GsonConverterFactory.create()) //设置使用Gson解析
                            .build();
                    // 步骤4:创建网络请求接口的实例
                    PostRequestInterface request = retrofit.create(PostRequestInterface.class);
                    //通过接口方法获取请求对象(需要传入翻译的内容)
                    Call<Translation> call = request.getCall("你好世界");
                    //步骤5:发送网络请求(同步)
                    Response<Translation> response = call.execute();
                    //步骤6:处理返回的数据结果
                    Log.d("Retrofit2.0请求结果", response.body().toString());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }
  • 输出日志
Retrofit2.0请求结果: Translation{type='ZH_CN2EN', errorCode=0, elapsedTime=1, translateResult=[[TranslateResult{src='你好世界', tgt='Hello world'}]]}

感谢

Android Retrofit 2.0 的详细 使用攻略(含实例讲解)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容