Retrofit的学习

2017-08-16  本文已影响16人  简单Liml

参考链接: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
上一篇下一篇

猜你喜欢

热点阅读