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的适配

results matching ""

    No results matching ""