前言
这篇文章还是老规矩,目的很明确就是掌握用法,一些基础的语法会穿插在掌握用法的例子中,力求花最少的时间上手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'}]]}
网友评论