Retrofit2

1,150 阅读4分钟

前言

Retrofit在我的理解是针对于okhttp的二次封装,它支持反序列化来解析数据,支持Rxjava,具有强大的可扩展性

Retrofit2.0注解

看Retrofit的源码发现共有有24个注解类,其中8个为请求方法类,13个参数类,3个标记类

请求方法

1.HTTP

这一个比较特殊,他可以代替其他的七个请求方法,提供了三个属性 method,path,hasBody

HTTP注解类

HTTP使用方式: method:请求的方式 path:请求的路径 (这里会加上BaseUrl) hasBody:是否包含请求体

	@HTTP(method = "get", path = "/address/list/{id}", hasBody = false)
    Call<BaseResponse<String>> getAddressList(@Path("id") int id);

2.GET 3.POST 4.PUT 5.OPTIONS 6.DELETE 7.PATH 8.HEAD

参数类

1.Field Field是发送Post请求时的表单字段,需要与FormUrlEncoded结合使用,不然会报错 示例:

    @POST("/addressList")
    @FormUrlEncoded
    Call<BaseResponse<String>> getAddressList(@Field("id") int id);

2.FieldMap 同上,Field只有一个参数,FieldMap可以传入多个参数 示例:

    @POST("/addressList")
    @FormUrlEncoded
    Call<BaseResponse<String>> getAddressList(@FieldMap() Map<String,String> map);

3.Header 4.Headers 5.HeaderMap Header三种都是用来添加请求头的,Header是用来添加一个请求头的,并且该请求头可为空,如果为空则忽略Headers与HeaderMap都是是用来添加一个或者多个请求头的,HeaderMap中的map是不可以为空,否则将报错 示例:

	//Header
 	@POST("/addressList")
    @FormUrlEncoded
    Call<BaseResponse<String>> getAddressList(@Header("Accept-Language") String language,@FieldMap() Map<String,String> map);

	//HeaderMap
    @POST("/addressList")
    @FormUrlEncoded
    Call<BaseResponse<String>> getAddressList(@HeaderMap() Map<String,String> language, @FieldMap() Map<String,String> map);

	//Headers
    @POST("/addressList")
    @FormUrlEncoded
    @Headers({"YYYY: YYYY," , " XXXX: XXXX"})
    Call<BaseResponse<String>> getAddressList(@FieldMap() Map<String,String> map);

6.Body 非表单字段,将请求参数以实体类承载,经过retrofit使其序列化,并将序列化的结果作为请求体发出去,向后端发送Json请求参数的时候可以用Okhttp的RequestBody将Json字符串转成对象发送给后端 示例:

 	RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);

    @POST("/igrp4api/dispatch.json")
    Call<BaseResponse<String>> getSystemAddress(@Body RequestBody body);

7.Url 用作动态Url设置 示例:

@GET 
Call<BaseResponse<String>> getData(@Url String user);

8.Part 9.PartMap 与Field功能相同,比Field携带的参数更丰富,包括数据流,所以适用于文件上传,配合Multipart注解使用,如果参数是MultipartBody则可以不提供Part名称,如果是其余的则需要提供Part名称,Map不需要提供Part名称

    @POST("/addressList")
    @Multipart
    Call<BaseResponse<String>> getAddressList(@Part("part") String part, @Part(value = "part" ,encoding = "8-bit") RequestBody body, @Part MultipartBody multipartBody);

    @POST("/addressList")
    @Multipart
    Call<BaseResponse<String>> getAddressLists(@PartMap() Map<String ,RequestBody> map);

10.Query 11.QueryMap 12.QueryName 作用于GET请求查询参数,就是类似http://127.0.0.1:8081/addresslist?id=12&name="张三",这个请求中的id与name就是Query的字段,QueryMap就是多个参数,QueryName作用与QueryMap类似

    @GET("/addressList")
    Call<BaseResponse<String>> getAddressLists(@Query("id") int id,@Query("name") String name);
        
    @GET("/addressList")
    Call<BaseResponse<String>> getAddressLists(@QueryMap() Map<String,String> query);

13.Path 用于GET请求中路径上替换指定的缺省值,会有一个默认的编码,也可以自己定义一个编码

    @GET("/addressList/{id}")
    Call<BaseResponse<String>> getAddressLists(@Path("id") int id);

标记类

1.FormUrlEncoded 用于标记当前请求提交的数据是Form表单数据 2.Multipart

用于标记当前的请求是支持文件上传的Form表单 3.Streaming 用于大文件下载的时候

Retrofit2.0基本使用

1.定义一个接口

public interface RequestApiManager {
    @GET("/addressList/{id}")
    Call<BaseResponse<String>> getAddressLists(@Path("id") int id);
}

2.创建Retrofit对象,并调用接口方法

  		OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.connectTimeout(15, TimeUnit.SECONDS);

        Retrofit retrofit=new Retrofit.Builder()
                .client(builder.build())
                .baseUrl("http://127.0.0.1:8080/")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();

        RequestApiManager apiManager = retrofit.create(RequestApiManager.class);
        apiManager.getAddressLists(12).enqueue(new Callback<BaseResponse<String>>() {
            @Override
            public void onResponse(Call<BaseResponse<String>> call, Response<BaseResponse<String>> response) {
                //成功
            }

            @Override
            public void onFailure(Call<BaseResponse<String>> call, Throwable t) {
                //失败
            }
        });

Retrofit2.0结合Rxjava2使用

结合Rxjava2使用则是将call改成observable

public interface RequestApiManager {
      @GET("/addressList/{id}")
    Observable<BaseResponse<String>> getAddressLists(@Path("id") int id);
}
  OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.connectTimeout(15, TimeUnit.SECONDS);

        Retrofit retrofit=new Retrofit.Builder()
                .client(builder.build())
                .baseUrl("http://127.0.0.1:8080/")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();

        RequestApiManager apiManager = retrofit.create(RequestApiManager.class);
        Observable<BaseResponse<String>> observable = apiManager.getAddressLists(12);
        observable.subscribeOn(Schedulers.io())
                .unsubscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<BaseResponse<String>>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        
                    }

                    @Override
                    public void onNext(BaseResponse<String> stringBaseResponse) {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });

在实际的开发中,我们肯定不是这么简简单单的创建一个接口,然后创建retrofit来去请求的,肯定还需要对retrofit进行封装,还需要对其进行一些设置,比如日志,请求头,rxjava提供的生命周期管理,cookie持久化等等设置