美文网首页
Retrofit的学习

Retrofit的学习

作者: 简单Liml | 来源:发表于2017-08-16 11:26 被阅读16次

    参考链接: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

    相关文章

      网友评论

          本文标题:Retrofit的学习

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