android Retrofit网络框架(一)之Retrofit详解

.

一、前言

Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装,底层是OKHttp,可以处理GET、POST、PUT、DELETE等请求,还可以使用Picasso加载图片。

 

二、注解

1.网络请求方法

@POST、@GET、@PUT、@DELETE全都是http中网络请求方式,@HTTP可以替换@POST、@GET、@PUT、@DELETE注解及更多功能,具体使用如下:

public interface RerofitService{
    /**
    *method:网络请求方法
    *path:网络请求地址
    *hasBody:是否有请求体
    */
    @HTTP(method="POST", path="blog/", hasBody= false)
    Call<ResponseBody> getUserInfo(@Path("id") int id);
}

2.标记类

@FormUrlEncoded:表示发送form-encoded表单数据,每个键值需要用 @Field来注释key名,随后的对象需要提供值,即value,如果多个键值对用注解@FieldMap。(@FormUrlEncoded和@Field或和@FieldMap成对出现,即配合使用)

如:登录页面使用:Content-Type:application/x-www-form-urlencoded。

@Multipart:表示发送form-encoded表单数据,适用于文件上传,每个键值需用@Part注解注释key名,随后对象提供键值value,多个文件上传用注解@PartMap。(@Multipart与@Part或@PartMap配合使用)

如:上传文件使用:Content-Type:multipart/form-data。

@Screaming:表示返回数据以流的形式返回,适用于返回数据较大的场景。如果微使用该注解,默认会把数据全部载入内存,之后取数据从内存中获取。

3.网络请求参数

@Headers:添加请求头,请求头固定,请求头不会相互覆盖

public interface RetrofitService{
    /**
    *content-type: 传输数据类型为json
    */
    @Headers("Content-type: application/json")
    @POST("blog/")
    Call<ResponseBody> getUserInfo();
    
    /**
    *Content-type: 请求数据类型为json
    *Accept:接收数据类型为json
    *Connection:网络连接类型,keep-alive为长链接,close为短链接
    */
    @Headers({"Content-type: application/json", "Accept: application/json", "Connection: keep-alive"})
    @POST("blog/")
    Call<ResponseBody> getUserInfo();
}

@Header:动态更新请求头,匹配的参数必须提供给 @Header ,若参数值为 null ,这个头会被省略,否则,会使用参数值的 toString 方法的返回值。

public interface RetrofitService{
    @POST("user/getUser")
    Call<ResponseBody> getUserInfo(@Header("Authorization") String authorization);
}

@Path:用于替换Url中地址缺省值

public interface RetrofitService{
    @POST("user/{id}")
    Call<ResponseBody> getUserInfo(@Path("id") String id);
}

@Url:用于请求地址url设置

public interface RetrofitService{
    @POST
    Call<ResponseBody> getUserInfo(@Url String url);
}

@Body:用于post请求发送非表单数据,会把我们传入的实体类转换为用于传输的HTTP请求体

public interface RetrofitService{
    @POST("user/getUser")
    Call<ResponseBody> getUserInfo(@Body User user);
}

@Query & @QueryMap:用于在url后拼接上参数

@GET("book/search")
Call<Book> getSearchBook(@Query("q") String name);//name由调用者传入
相当于:
@GET("book/search?q=name")
Call<Book> getSearchBook();

@Field & FieldMap:发送 Post请求 时提交请求的表单字段,与 @FormUrlEncoded 注解配合使用

public interface RetrofitService{
    @FormUrlEncoded
    @POST("user/getUser")
    Call<ResponseBody> getUserInfo(@Field("name") String name, @Field("idCard") String idCard);
    
     @FormUrlEncoded
    @POST("user/getUser")
    Call<ResponseBody> getUserInfo(@FieldMap Map<String, String> userMap);
}

@Part & @PartMap:发送 Post请求 时提交请求的表单字段,与 @Multipart 注解配合使用,适用于上传文件

public interface RetrofitService{
    /**
    *Part后面支持三种类型,RequestBody、okhttp3.MultipartBody.Part、任意类型
    * 除okhttp3.MultipartBody.Part 以外,其它类型都必须带上表单字段中已经包含了表单字段的信息
    */
    @Multipart
    @POST("user/getUser")
    Call<ResponseBody> getUserInfo(@Part("name") RequestBody name, @Part MultipartBody.part file);
    
    /**
    *PartMap 注解支持一个Map作为参数,支持 {@link RequestBody } 类型,
    * 如果有其它的类型,会被retrofit2.Converter转换,
    */
    @Multipart
    @POST("user/getUser")
    Call<ResponseBody> getUserInfo(@PartMap Map<String, String> userMap);
}

三、创建Retrofit发送网络请求

 

1.创建retrofit

Retrofit retrofit = new Retrofit.Builder()
        .addConverterFactory(GsonConverterFactory.create())//json转换器
        .baseUrl("https://api.douban.com/v2/")
        .build();

2.定义Http Api请求接口

public interface RetrofitService{
    @POST("book/search")
    Call<Book> getBookInfo(@Query("name") String name);
}

3.创建请求接口实例

RetrofitService retrofirService = retrofit.create(RetrofitService.class);

4.用接口实例创建请求

Call<Book> call = retrofirService.getBookInfo("目送");

5.发送请求

 

  • 异步请求
call.enqueue(new Callback<Book>() {
    @Override
    public void onResponse(Call<Book> call, Response<Book> response) {
        
    }

    @Override
    public void onFailure(Call<Book> call, Throwable t) {
        //如果设置了重试,但有些接口不需要重试
        call.cancel();
    }
});
  • 同步请求
Response<Book> response = call.excute();

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章