Retrofit的学习
参考链接:https://academy.realm.io/cn/posts/droidcon-jake-wharton-simple-http-retrofit-2/
Retrofit是Square的开源项目,简化http的请求库。已经出来不少时间了,自己对新技术的了解不够及时。前几天学习了下,做个简单的笔记。
自己对Retrofit1的了解较少,学习的时候是直接使用了Retrofit2这个版本。
Retrofit 2 是对okhttp的封装。里面有个Call对象,要注意的是只能被调用一次,如果需要调用多次的话,需要使用clone方法。
自己搭了个简单的web服务,接口url为:http://192.168.1.112:8080/MyText/helloworld3?test=successhaha , 返回successhaha
添加gradle添加依赖:
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.8.1'
首先是请求接口代码,代码如下:
public interface RequestService {
@FormUrlEncoded
@POST("helloworld3")
Call<String> getTest(@Field("test") String test);
@GET
Call<String> dynamicsUrl(@Url String url);
}
getTest为我们所要请求的接口。@Field为方法url传入值,@Path标签可替换url中{}中的值。注意:如果有前缀 / 就代表着是一个绝对路径。删除了那个前缀的 /, 你将会得到正确的url。
实例化该RequestService方法代码如下:
RequestService service = new Retrofit.Builder()
.baseUrl("http://192.168.1.112:8080/MyText/")
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())//使用 RxJava 来代替 call
.addConverterFactory(GsonConverterFactory.create())//放最后
.client(httpClient)
.build().create(RequestService.class);
addConverterFactory方法的顺序很重要,它是先符合就执行哪个。如数据为Json,则符合GsonConverter,使用该方式,即使下面还有符合的,也不会执行。
调用方法,生成Call实例:
Call<String> call = service.getTest("successhaha");
response = call.execute();
// This will throw IllegalStateException:
response = call.execute();
Call<List<Contributor>> call2 = call.clone();
// This will not throw:
response = call2.execute();
实现异步,需要调用 enqueue 方法。
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
tvName.setText(getResponseString(response));
}
@Override
public void onFailure(Call<String> call, Throwable t) {
Toast.makeText(MainActivity.this,"请求失败",Toast.LENGTH_SHORT).show();
}
});
可使用cancel方式结束请求:
call.cancel();
请求回来的Response对象主要的属性如下,使用方法打印:
private String getResponseString(Response<String> response){
String str = "";
str += "code:"+response.code()+"\n";
str += "message:"+response.message()+"\n";
str += "isSuccess:"+response.isSuccessful()+"\n";
str += "body:"+response.body()+"\n";
str += "errorBody:"+response.errorBody()+"\n";
str += "headers:"+response.headers()+"\n";
return str;
}
另外,上述url以注入方式,我们也可以动态使用@Url标签完成动态url的访问,见上。
接下来我们添加okhttp的依赖:
OkHttpClient httpClient = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
Request request = chain.request();
//添加公共参数
HttpUrl url = request.url().newBuilder().addQueryParameter("", "").build();
//如要添加头部
//request.newBuilder().header("", "");
return chain.proceed(request.newBuilder().url(url).build());
}
})
.addInterceptor(new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
Log.e("Main",message);
}
}).setLevel(HttpLoggingInterceptor.Level.BASIC))
.readTimeout(TIME_OUT, TimeUnit.SECONDS)
.connectTimeout(TIME_OUT, TimeUnit.SECONDS)
.build();
代码完成,显示如下:
image.png