Retrofit2

前言

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

Retrofit2.0注解

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

请求方法

1.HTTP后端

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

HTTP注解类

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

@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.HEADcookie

参数类

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

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

2.FieldMap 同上,Field只有一个参数,FieldMap能够传入多个参数 示例:ide

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

3.Header 4.Headers 5.HeaderMap Header三种都是用来添加请求头的,Header是用来添加一个请求头的,而且该请求头可为空,若是为空则忽略Headers与HeaderMap都是是用来添加一个或者多个请求头的,HeaderMap中的map是不能够为空,不然将报错 示例:ui

//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持久化等等设置

相关文章
相关标签/搜索