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:查询内容。
  • 请求返回结果

    《Retrofit2.0》 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:???。可为空。
  • 请求返回结果

    《Retrofit2.0》 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 的详细 使用攻略(含实例讲解)

    原文作者:luoqiang108
    原文地址: https://www.jianshu.com/p/c60eed6f75c5
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞