程序员Android知识Android技术知识

Retrofit2 使用方法

2017-03-15  本文已影响329人  雨林雨林

Retrofit2

网络客户端框架

资料

Github
官网

你真的会用Retrofit2吗?Retrofit2完全教程

配置

导入

compile 'com.squareup.retrofit2:retrofit:2.2.0'
compile 'com.squareup.retrofit2:converter-gson:2.2.0' // 使用Gson转换json
compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0' // 使用RxJava2

混淆

# Platform calls Class.forName on types which do not exist on Android to determine platform.
-dontnote retrofit2.Platform
# Platform used when running on Java 8 VMs. Will not be used at runtime.
-dontwarn retrofit2.Platform$Java8
# Retain generic type information for use by reflection by converters and adapters.
-keepattributes Signature
# Retain declared checked exceptions for use by a Proxy instance.
-keepattributes Exceptions

基本用法

// Bean
public class Repo {
    public long id;
    public String name;
}

// 请求接口
public interface GitHubService {
    @GET("users/{user}/repos")
    Call<List<Repo>> listRepos(@Path("user") String user);
}

// Retrofit 实例
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://api.github.com/")  // 主机
        .addConverterFactory(GsonConverterFactory.create())  // 转换器
        .build();

// 网络请求
Call<List<Repo>> call = retrofit.create(GitHubService.class)  // 获取服务
        .listRepos("octocat"); // 获取请求

// 响应处理,异步或同步
call.enqueue(new Callback<List<Repo>>() {  // 获取响应
    @Override
    public void onResponse(Call<List<Repo>> call, Response<List<Repo>> response) {
        if (response.isSuccessful()) {  // 响应码 200~300
            Log.d(TAG, "onResponse: " + response.body()); // 显示 List<Repo>
        }
    }

    @Override
    public void onFailure(Call<List<Repo>> call, Throwable t) {

    }
});

请求接口

请求方法

@GET("users/list")
@GET("users/list?sort=desc")

请求参数

// 通过 @Path 替换相对地址中的 {}
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);

// 通过 @Query 设置请求参数
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);

// 通过 @QueryMap 设置请求参数 Map
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);

请求头

@Headers("Cache-Control: max-age=640000")
@GET("widget/list")
Call<List<Widget>> widgetList();

@Headers({
    "Accept: application/vnd.github.v3.full+json",
    "User-Agent: Retrofit-Sample-App"
})
@GET("users/{username}")
Call<User> getUser(@Path("username") String username);
@GET("user")
Call<User> getUser(@Header("Authorization") String authorization)

请求体

@POST("users/new")
Call<User> createUser(@Body User user);
@FormUrlEncoded  // Form表单
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);

@Multipart  // 上传文件表单
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);

其他

Retrofit 设置

转换器

Gson gson = new GsonBuilder()
        .setDateFormat("yyyy-MM-dd hh:mm:ss")  // 配置 Gson
        .create();

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com")
    .addConverterFactory(GsonConverterFactory.create(gson))  // 设置转换器,可传入Gson实例
    .build();

GitHubService service = retrofit.create(GitHubService.class);

OkHttpClient

HttpLoggingInterceptor logging = new HttpLoggingInterceptor()
        .setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient httpClient = new OkHttpClient.Builder()
        .addInterceptor(logging)
        .build();
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://api.github.com/")
        .client(httpClient)
        .build();

CallAdapter

其他

响应处理

// 异步
call.enqueue(new Callback<List<Repo>>() {
    @Override
    public void onResponse(Call<List<Repo>> call, Response<List<Repo>> response) {

    }

    @Override
    public void onFailure(Call<List<Repo>> call, Throwable t) {

    }
});

// 同步
try {
    Response<List<Repo>> response = call.execute();
} catch (IOException e) {
    e.printStackTrace();
}

// 取消 Call
call.cancel();

联合 Rxjava

// Bean
public class Repo {
    public long id;
    public String name;
}

// 请求接口
public interface GitHubService {
    @GET("users/{user}/repos")
    Observable<List<Repo>> listReposBy(@Path("user") String user);
}

// Retrofit 实例
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://api.github.com/")
        .addConverterFactory(GsonConverterFactory.create())
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())  // 转换器
        .build();

// 网络观察者
Observable<List<Repo>> observable = retrofit.create(GitHubService.class)
        .listReposBy("octocat");

// 数据处理
observable.subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Consumer<List<Repo>>() {
            @Override
            public void accept(@NonNull List<Repo> repos) throws Exception {
                Log.d(TAG, "Rxjava2 - onResponse: " + repos);
            }
        });
上一篇 下一篇

猜你喜欢

热点阅读