Retrofi分析(一)

Retrofit是Square公司开源的一个高质量高效率的HTTP库,目前github上面star数量最多的Android网络库就是这个了。底层封装了okhttp,JakeWharton大神的经典作品之一。代码写的非常优雅,用了很多经典的设计模式。非常有必要了解一下它的源码。

首先看一下官网给出的它的基本用法

gradle中引入库

implementation 'com.squareup.retrofit2:retrofit:2.4.0'

如果使用gson来解析返回的数据还需导入下面的库。Retrofit支持各种序列化解析fastjson,jackjson等都可以,也可以继承Converter.Factory 接口自己自定义。

compile 'com.squareup.retrofit2:converter-gson:2.3.0'

如果使用RxJava来配合Retrofit,还需要加入

compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'

1、定义一个接收数据的实体类

public class Repo {

    private int id;
    private String name;
    private String full_name;
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getFull_name() {
        return full_name;
    }

    public void setFull_name(String full_name) {
        this.full_name = full_name;
    }

2、定义一个网络接口

public interface GitHubService {
    @GET("users/{user}/repos")
    Call<List<Repo>> listRepos(@Path("user") String user);
}

3、创建Retrofit对象和service 对象

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://api.github.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
GitHubService service = retrofit.create(GitHubService.class);

4、看一下异步请求:创建Call对象并执行异步请求

Call<List<Repo>> call = service.listRepos("octocat");
        call.enqueue(new Callback<List<Repo>>() {
            @Override
            public void onResponse(Call<List<Repo>> call, Response<List<Repo>> response) {
                Log.i("response",response.body().toString());
            }

            @Override
            public void onFailure(Call<List<Repo>> call, Throwable t) {
                Log.i("onFailure",t.toString());
            }
        });

onResponse中就得到了我们想要获得的数据。

第一步创建实体类就不说了从第二步开始,看一下接口GitHubService ,Retrofit是把接口转换为可调用对象的类。

GitHubService 非常简单,不过却做了很多工作,配置了:
请求方式:@GET
请求的相对路径:"users/{user}/repos" 和Retrofit中的baseUrl可以拼成一个完整的URL路径
请求的方法名字:listRepos
请求参数:@Path("user") String user
返回值:Call<List<Repo>> 返回一个Call对象,Call对象用于后面的网络请求。

GitHubService 这个接口中使用了很多注解,后面Retrofit会通过这些注解,把这个接口转换成可调用的对象类。Retrofit中总共有四十多个类,其中一半多是注解类。所以下面先看看这些注解类是干啥的。

请求方式注解:@GET @POST、@PUT、@DELETE、@PATCH、@OPTIONS、@HTTP(自定义方式)

请求类型注解:@FormUrlEncoded、@Multipart、@Streaming

@FormUrlEncoded form表单请求,对应的 Content_Type:"application/x-www-form-urlencoded" 参数使用 @Field 或者 @FieldMap修饰

@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);

@Multipart 支持上传文件的form表单。对应的 Content_Type:"multipart/form_data" 参数使用@Part修饰 文件参数是okhttp中的RequestBody

@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);

@Streaming 通过流的方式返回响应。当返回数据较大的时候使用。或者用于大文件的下载

@Streaming
@GET
Call<ResponseBody> downloadFileWithDynamicUrlAsync(@Url String fileUrl);

请求参数注解:@Query 、@QueryMap、@Body、@Field、@FieldMap、@Part、@PartMap 修饰方法参数

@Query :用于添加查询参数 拼接参数如:name=张三&six=男&page=1。 参数值可以为空

@GET("/list")
Call<ResponseBody> list(@Query("page") int page);

@QueryMap : 每一项发键和值都不能为空

@GET("/search")
Call<ResponseBody> list(@QueryMap Map<String, String> filters);

@Body: 可以直接传一个对象 参数不能为null

 @POST("/")
 Call<ResponseBody> sendNormal(@Body Repo repo);

@Body:可以上传文件 其参数是okhttp中的MultipartBody 类

 @POST("users/image")
    Call<NetResponse<Object>> uploadFileWithRequestBody(@Body MultipartBody multipartBody);

@Field 用String.valueOf()把参数值转换为String,然后践行URL编码,当参数值为null时,会自动忽略

@FormUrlEncoded
@POST("/")
Call<ResponseBody> example(@Field("name") String name,@Field("occupation") String occupation);

@FieldMap: 每一项的键和值都不能为空

@FormUrlEncoded
@POST("/things")
Call<ResponseBody> things(@FieldMap Map<String, String> fields);

@Part:用于定义Multipart请求的每个part 参数值可以为空,为空时,则忽略

@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);

@PartMap 每一项的键和值都不能为空

@Multipart
@POST("/files")
Call<UploadInformationTransfer> uploadFiles(@PartMap Map<String, RequestBody> params);

其它注解:@Path、@Header、@Headers、@Url

@Path:用于方法的参数 用于替换url中的参数 参数的值不能为空

@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);

@Header 用于添加请求头 如果请求头部固定可以使用这个添加 。 可以为空,当为空时,会自动忽略

@GET("/")
Call<ResponseBody> foo(@Header("Accept-Language") String lang);

@Headers 用于添加一个或多个请求头中

//添加多个请求头
@Headers({ "X-Foo: Bar", "X-Ping: Pong"})
@GET("/")

@Url: 用于添加请求的接口地址

@GET
Call<ResponseBody> list(@Url String url);

OK,下一篇开始分析Retrofit对象和service 对象的创建。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值