美文网首页
Retrofit2.0

Retrofit2.0

作者: luoqiang108 | 来源:发表于2018-11-19 22:25 被阅读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 的详细 使用攻略(含实例讲解)

    相关文章

      网友评论

          本文标题:Retrofit2.0

          本文链接:https://www.haomeiwen.com/subject/pgikfqtx.html