Retrofit在个人理解是针对于okhttp的二次封装,它支持反序列化来解析数据,支持Rxjava,具备强大的可扩展性java
看Retrofit的源码发现共有有24个注解类,其中8个为请求方法类,13个参数类,3个标记类json
1.HTTP后端
这一个比较特殊,他能够代替其余的七个请求方法,提供了三个属性 method,path,hasBody api
![]()
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 用于大文件下载的时候
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) {
//失败
}
});
复制代码
结合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持久化等等设置