美文网首页
Retrofit简单使用

Retrofit简单使用

作者: Xx_young | 来源:发表于2016-08-02 17:37 被阅读0次

    Retrofit是什么

    对于Retrofit ,官方的描述是:“A type-safe REST client for Android and Java.”它可以通过注解来描述Http请求,URL参数,查询参数,同时,它还支持多个请求体和文件上传
    Retrofit 2默认情况下利用okhttp为网络层

    Retrofit用法示例

    官网示例

    • 1 定义java接口
    public interface GitHubService {
          @GET("users/{user}/repos")
          Call<List<Repo>> listRepos(@Path("user") String user);
    }
    

    该接口定义了一个 listRepos方法,该方法会通过HTTP GET请求去访问服务器的/users/{user}/repos路径并把返回的结果封装为List<Repo>Java对象返回。其中URL路径中的{user}的值为listRepos方法中的参数 user的取值。

    • 2 通过 RestAdapter类来生成一个 GitHubService 接口的实现;
    Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://api.github.com/")
        .build();
    GitHubService service = retrofit.create(GitHubService.class); 
    
    • 3 获取接口的实现后就可以调用接口函数来和服务器交互
    Call<List<Repo>> repos = service.listRepos("octocat");
    

    从上面的示例可以看出, Retrofit 使用注解来声明HTTP请求

    • 支持 URL 参数替换和查询参数
    • 返回结果转换为Java对象(返回结果可以为JSON, protocol buffers)
    • 支持 Multipart请求和文件上传

    一般使用

    首先定义接口

    public interface ApiCallBiz {
            @GET("data/Android/{number}/{page}")
            Call<List<AndroidInfoBean>> getAndroidInfo(@Path("number") int number, @Path("page") int page);
    }
    

    getAndroidInfo( )方法通过注解@GET标注为get请求,完整的url根据创建retrofit对象时传入的baseUrl+@GET的所填写的value组成,value的完整值会根据调用接口是传入的参数补充完整,例如data/Android/10/1
    创建 retrofit对象完成请求服务器

    Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("http://gank.io/api/")
        .addConverterFactory(GsonConverterFactory.create())//gson解析
        .build();
    ApiCallBiz mApiCallBiz =retrofit.create(ApiCallBiz.class);
    Call<List<AndroidInfoBean>> call = mApiCallBiz.getAndroidInfo1(10,1);
    call.enqueue(new Callback<List<AndroidInfoBean>>() {     
          @Override
          public void onResponse(Call<List<AndroidInfoBean>> call,Response<List<AndroidInfoBean>> response) {
              Log.e("TAG",response.body().toString());
          }     
          @Override
          public void onFailure(Call<List<AndroidInfoBean>> call, Throwable t) {
    
          }
    });
    

    构造者模式构建了baseurlConverterFactory,通过GsonConverterFactory完成对服务器返回的json数据进行对象的转换
    注意:.addConverterFactory(GsonConverterFactory.create())
    这里如果使用gson,需要额外导入
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'

    上述示例展示了使用@Path可实现动态url的访问,retrofit还支持

    • 查询参数的设置@Query
    @GET("group/{id}/users")
    Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);
    

    对于复杂的查询参数的组合可以使用一个Map。

    @GET("group/{id}/users")
    Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);
    
    • @POST请求体@Body
    @POST("users/new")
    Call<User> createUser(@Body User user);
    
    • 表单的方式传递键值对@FormUrlEncoded
    @FormUrlEncoded
    @POST("user/edit")
    Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
    
    • 单文件上传@Multipart
    @Multipart
    @PUT("user/photo")
    Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);
    
    • 多文件上传@PartMap
    @Multipart @POST("register") 
    Call<User> registerUser(@PartMap Map<String, RequestBody> params, @Part("description") RequestBody description);}
    

    相关文章

      网友评论

          本文标题:Retrofit简单使用

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