Retrofit2.0详解(一简单使用)

    几个月前,对Retrofit进行了一个系统的学习,不过没有做一个整理和总结,正好国庆没什么事就写几篇博客对Retrofit的简单使用,上传下载进度监听,封装使用,源码解析做一个学习,记录如下

1~简单使用

      由于retrofit2.0与先前版本的差别还是比较大,对于不同版本之间的差异在这里就不在进行详细区别。下面的例子也是针对于retrofit2.0进行介绍的。retrofit2.0它依赖于OkHttp,而且这部分也不再支持替换。在这里我们也不需要显示的导入okHttp,在retrofit中已经导入okhttp3。

添加依赖

      compile 'com.squareup.retrofit2:retrofit:2.1.0'
      compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2' 

创建Api接口

public interface ApiService {
         //GET为GET请求,标明请求地址为BASEURI+/users/{user}
         //{user}会被getFeed方法的参数代替
         //JsonBean为自己设置返回类型,通过.addConverterFactory(GsonConverterFactory.create())
         //利用gson自动完成数据转换
         @GET("users/{user}")
         Call<JsonBean> getFeed(@Path("user")String user);
       }
将http api转换为java接口,指定请求方式,和确定返回值类型


创建Retrofit实例

Retrofit retrofit=new Retrofit.Builder()
                        .baseUrl("https://api.github.com/")// '/'尽量放在baseUri的后面而不是放在注解中url的前面
                         //添加转换器完成数据转换,将Json类型的数据转换为JavaBean
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();

调用Api接口

在调用API接口请求后,获得一个json字符串,通过Gson进行解析成一个JsonBean

               //得到ApiService
                ApiService service=retrofit.create(ApiService.class);
                Call<JsonBean> call = service.getFeed("Guolei1130");
                call.enqueue(new Callback<JsonBean>() {
                    @Override
                    public void onResponse(Response<JsonBean> response, Retrofit retrofit) {
                        JsonBean jsonBean=response.body(); 
                        Log.e(TAG, "onResponse: "+jsonBean.toString());
                    }

                    @Override
                    public void onFailure(Throwable t) {
                        Log.e(TAG, "onFailure: "+t.getMessage());
                    }
                });

2~Retrofit注解详解

请求方式

  GET,POST,HEAD,PUT等等,其实常用的就GET和POST


路径拼接

  ①Path

Call<JsonBean> getFeed(@Path("user")String user);    

  ②Query-一个键值对

Call<JsonBean> onekey(@Query("wd") String wdvalue);   

  ③QueryMap-多个键值对

Call<JsonBean> manykey(@QueryMap  Map<string, string> options);

 对于下面这张拼接

Call<JsonBean> test(@Path("user")String user,@Query("name")String name,@QueryMap Map<String,String> options);

     HashMap<String,String> map=new HashMap<String,String>();
            map.put("age",1);
            map.put("password","123");      
            Call<JsonBean> feed = service.getFeed("xx","liujian",map);

最终拼接成的url为BaseUri+"group/xx?name=liujian&&age=1&&password=123"


 ④请求体

我们知道post和get的区别当中有一点就是参数的位置,get放在url路径当中,post放在请求体当中。   
注意:请求体对象会转换成json格式数据提交,服务器端需要进行json解析

@POST("users/new.jsp")
Call<User> createUser(@Body User user);

⑤表单FormUrlEncoded

使用表单格式进行post提交,每个键值对都要被含有名字的@Field注解和提供值的对象所标注

@FormUrlEncoded
@POST("/index.php")
Call<User> updateUser(@Field("first_name") @Body User user, @Field("last_name") String last);

我们还可以使用下面的简单方式

//@FieldMap注解和Map对象参数来指定每个表单项的Key,value的值:
@FormUrlEncoded
@POST("user/index.php")
Call<User> updateUser(@FieldMap Map<String,String> fieldMap);

⑥表单Multipart

通过@Multipart注解来发送Multipart数据。通过@Part注解来定义需要发送的文件。

@Multipart
@POST("/fileabout.php")
Call<String> upload(@Part("fileName") String des,
                          @Part("file\"; filename=\"1.txt") RequestBody file);

⑧Header处理

以使用@Headers注解给函数设置静态的header

@Headers("Cache-Control: max-age=640000")
@Headers({
              "Accept: application/vnd.github.v3.full+json",
              "User-Agent: Retrofit-Sample-App"
           })

⑨Url

Retrofit2.0中提出一个新的注解@Url,允许我们直接传入请求的URL

       @GET
       Call<List<Contributor>> repoContributorsPaginate(@Url String url);

3~同步和取消任务

同步

Response<JsonBean> response=call.excute()
JsonBean jsonBean=response.body();   

取消正在执行的任务

call.cancel()



4~Retrofit与RxJava

    <span style="font-size:14px;">@GET("users/{user}") 
     Observable<JsonBean> getFeed(@Path("user")String user);
     
     Retrofit retrofit = new Retrofit.Builder()
        .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
        .addConverterFactory(GsonConverterFactory.create())
        .baseUrl("https://api.github.com/")
        .build();
     
     
     ApiService service=retrofit.create(ApiService.class);
     service.getFeed("Guolei1130")
     .observeOn(AndroidSchedulers.mainThread())//让订阅的操作发送在主线程中
     .subscribe(new Observer<JsonBean>() {
        @Override
        public void onNext(JsonBean user) {
            userView.setUser(user);
        }
        
        @Override
        public void onCompleted() {
        }

        @Override
        public void onError(Throwable error) {
            // Error handling
            ...
        }
    });  </span>

对于RxJava不熟悉的可以去看一下我前面的博客,RxJava的优点我就不多说了,也就链式调用,使的代码逻辑更加清晰,增加代码的可读性,另外通过一系列的操作符完成对发出的消息进行一系列变化操作





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值