介绍
Retrofit2.0是一个比较流行的网络开源库,可以用来进行同步或异步的网络请求,现在,我就通过例子(访问翻译词霸进行翻译)讲解的方式,给大家演示一下其基本用法
使用步骤
添加依赖
compile 'com.squareup.retrofit2:retrofit:2.0.2'
// Retrofit库
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
一个是Retrofit库,一个是gson库
定义结果类
翻译词霸的结果格式是这样:
status:翻译状态
Content字段:翻译结果的封装:里面有from(原文语言)、to(翻译成哪种语言)、vendor(翻译提供者,就到底谁翻译的,有道还是谁)、out(翻译结果)、errNo(错误码,没错误则为0)
故而把结果类定义成下面的样子,里面封装一个内部类Content:
public class Result {
private int status;
private Content content;
private class Content{
private String from;
private String to;
private String vendor;
private String out;
private int errNo;
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("{");
sb.append("\"from\":\"")
.append(from).append('\"');
sb.append(",\"to\":\"")
.append(to).append('\"');
sb.append(",\"vendor\":\"")
.append(vendor).append('\"');
sb.append(",\"out\":\"")
.append(out).append('\"');
sb.append(",\"errNo\":")
.append(errNo);
sb.append('}');
return sb.toString();
}
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("{");
sb.append("\"status\":")
.append(status);
sb.append(",\"content\":")
.append(content.toString());
sb.append('}');
return sb.toString();
}
}
定义请求接口
Retrofit里网络请求的执行,要先通过调用自定义接口里的方法获取一个Call对象,而后Call对象同步或异步执行请求。
所以我们要自定义请求接口,但要用上retrofit的注解
public interface IRequest {
@GET("ajax.php")
Call<Result> getResult(@Query("a") String a,@Query("f") String from
,@Query("t") String to,@Query("w") String w);
//@Query用于在?之后传参
}
解释:@GET表示用get方法进行网络请求,里面的参数是相对地址,也可以用绝对地址,但不推荐那样,代码复用性不好
Call<Result>网络请求完后,返回一个Call对象,这个是Retrofit中封装好的类,泛型特定化为自定义的Result
方法参数列表,网络请求的参数,顺序不可打乱。以@Query("a") String a为例,意思是加上一个参数a,值是外界传来的String类型的a
上面方法执行后,生成的url是:
ajax.php?a=a&f=from&t=to&w=w
调用API进行网络请求
构造Retrofit对象
我们要用到Retrofit对象来开启网络请求,于是就要调用一系列的API
Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
解释:baseUrl()设定请求的基础URL,参数是我写的静态final字段BASE_URL
public static final String BASE_URL = "http://fy.iciba.com/";
ConverterFactory:解析工厂,一般就直接用GSON,把返回的json数据解析成java对象
CallAdapterFactory:直接用RxJava的工厂
构造请求接口对象
final IRequest request = retrofit.create(IRequest.class);
看源码的话,这儿是一个动态代理
调用接口方法,获取请求对象
Call<Result> call = request.getResult("fy", "auto", "auto", "I`m%20good%20to%go!");
按顺序传入参数,这样的话,请求URL就是:
http://fy.iciba.com/ajax.php?a=fy&f=auto&t=auto&w=I`m%20good%20to%20go!
解释:a=fy,固定的
f=auto:自动识别原文语言
t=auto:默认译文语言是中文
w=I`m%20good%2to%20go!:原文是I`m%20good%2to%20go!,网络请求中空格用%20代替
请求对象执行请求
call.enqueue(new Callback<Result>() {
//enqueue():异步
...
});
enqueue()方法执行异步请求,execute()则为同步
里面传入回调接口,处理请求后的回调
处理回调
@Override
public void onResponse(Call<Result> call, Response<Result> response) {
int code = response.code();
if (code == 200) {
String result = response.body().toString();
Log.i(TAG, result);
} else {
Log.i(TAG, "responseCode=" + code);
}
}
@Override
public void onFailure(Call<Result> call, Throwable t) {
t.printStackTrace();
dismissDialog();
}
onResponse()是正常请求的结果回调,onFailure()是发生异常的回调
我们只看onResponse():
请求码成功的情况下,获取response.body()、也就是result对象
运行结果
可以看到,返回了正确结果。