Retrofit2
简介
网络请求框架,使用注解方式设置参数。
项目地址
https://github.com/square/retrofit
简单的使用
http://square.github.io/retrofit/
1.请求接口
public interface GitHubService {
@GET("users/{user}/repos")
Call<List<Repo>> listRepos(@Path("user") String user);
}
2.创建Retrofit,实现请求接口
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.build();
GitHubService service = retrofit.create(GitHubService.class);
3.使用请求
Call<List<Repo>> repos = service.listRepos("octocat");
Retrofit.Builder设置
Retrofit.Builder builder = new Retrofit.Builder();
OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
/**
* 对OkHttp进行设置
*/
builder.client(okHttpClient);
/**
* 根目录,需要
*/
builder.baseUrl("https://api.github.com/");
/**
*增加返回方式
*/
builder.addCallAdapterFactory(RxJavaCallAdapterFactory.create());
/**
* 增加转换器
*/
builder.addConverterFactory(GsonConverterFactory.create());
/**
* 检测 mRetrofit.create(GitHubService.class)
*/
builder.validateEagerly(true);
/**
* 自定义Executor
*/
//builder.callbackExecutor()
/**
* 设置okhttp.Call.Factory
*/
//builder.callFactory()
mRetrofit = builder.build();
mService = mRetrofit.create(GitHubService.class);
注解详解
请求方式注解
名称 | 描述 |
---|---|
GET | get方式请求 |
POST | post方式请求 |
PUT | put方式请求 |
DELETE | delete方式请求 |
PATCH | patch方式请求 |
HEAD | head方式请求 |
OPTIONS | options方式请求 |
HTTP | 可以代替上面的7种方式@HTTP(method = "DELETE", path = "remove/", hasBody = true) |
注:结合@Path可以指定变量。</br>@GET("group/{id}/users") Call
test0(@Path("id") int id);
</br>
标记注解
名称 | 描述 |
---|---|
FormUrlEncoded | Content-Type:application/x-www-form-urlencoded |
Multipart | Content-Type:multipart/form-data |
Streaming | 响应体为数据流形式,默认是会把数据都会载入到内存中 |
注:FormUrlEncoded和Multipart不能同时使用,否则会报错。
</br>
参数注解
名称 | 描述 |
---|---|
Headers | 作用在方法中,可以增加多个请求头 |
Header | 添加不固定值头 |
Body | 就是一个请求数据 |
Field | 在FormUrlEncoded是的时候使用 |
FieldMap | 在FormUrlEncoded是的时候使用 |
Part | 在Multipart是的时候使用 |
PartMap | 在Multipart是的时候使用 |
Path | 代替url中的参数 |
Query | 查询参数 |
QueryName | 查询参数 |
QueryMap | 查询参数 |
Url | url地址路径 |
注:@Url设置后,1.请求方式里url地址不能填写,否则会冲突;2.不能使用@Path,不能在参数@Query后。
自定义Converter
Converter是对请求和返回数据的转换
注:addConverterFactory有顺序,如果有多个Factory可以接收数据会被第一接收使用。
MyRetrofitConverterFactory.class
/**
* 用于向Retrofit提供相应Converter的工厂
*/
public class MyRetrofitConverterFactory extends Converter.Factory {
public static MyRetrofitConverterFactory create() {
return new MyRetrofitConverterFactory();
}
private MyRetrofitConverterFactory() {
}
// 在这里创建 从自定类型到ResponseBody 的Converter,不能处理就返回null,
// 主要用于对Part、PartMap、Body注解的处理
@Override
public Converter<MyRetrofitObject, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
return new MyRetrofitRequestBodyConverter();
}
// 这里创建从ResponseBody其它类型的Converter,如果不能处理返回null
// 主要用于对响应体的处理
@Override
public Converter<ResponseBody, MyRetrofitObject> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
if(type == MyRetrofitObject.class){
return new MyRetrofitResponseBodyConverter();
}
return null;
}
}
MyRetrofitRequestBodyConverter.class
/**
* 对自定义请求转换
*/
public class MyRetrofitRequestBodyConverter implements Converter<MyRetrofitObject, RequestBody> {
private static final MediaType MEDIA_TYPE = MediaType.parse("自定义头; charset=UTF-8");
@Override
public RequestBody convert(MyRetrofitObject value) throws IOException {
StringBuilder stringBuilder = new StringBuilder("自定义body:int");
stringBuilder.append(value.getAnInt());
stringBuilder.append("====String:");
stringBuilder.append(value.getString());
//创建请求数据
return RequestBody.create(MEDIA_TYPE,stringBuilder.toString());
}
}
MyRetrofitResponseBodyConverter.class
/**
* 将返回的数据转成成Call<T>中的T
*/
public class MyRetrofitResponseBodyConverter implements Converter<ResponseBody,MyRetrofitObject> {
@Override
public MyRetrofitObject convert(ResponseBody value) throws IOException {
MyRetrofitObject retrofitObject = new MyRetrofitObject();
retrofitObject.setAnInt(12);
retrofitObject.setString("string");
return retrofitObject;
}
}
自定义CallAdapter
对Call< T >中Call的适配