Retrofit 备忘

637 查看

本来很抗拒 Retrofit 的,结果前几天在车上无聊想了一下,诶这玩意其实挺美的啊!

引入

在 21 世纪 10 年代还需要自己拷贝 jar 包的库都是耍流氓。—— 我说的

dependencies {
    compile 'com.squareup.retrofit:retrofit:1.6.1'
}

Gradle 是什么自己恶补去。

声明 API

我喜欢对照着 Resource 来声明 API。

public interface Greet {

    @FormUrlEncoded
    @POST("/greets")
    void create(@Field("message") String message, Callback<Void> callback);

}

构建类

public class YeahApi {

    private static final String ENDPOINT = "https://api.yeah.xingrz.us";

    // 让 Gson 自动将 API 中的下划线全小写式变量名转换成 Java 的小写开头驼峰式
    private static final Gson gson = new GsonBuilder()
            .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
            .create();

    private static final RestAdapter adapter = new RestAdapter.Builder()
            .setEndpoint(ENDPOINT)
            .setConverter(new GsonConverter(gson))
            .setRequestInterceptor(new RequestInterceptor() {
                @Override
                public void intercept(RequestFacade request) {
                    request.addHeader("User-Agent", "Yeah/" + BuildConfig.VERSION_NAME);
                    request.addHeader("Accept", "application/json");
                }
            })
            .build();

    private static final Greet GREET_API = adapter.create(Greet.class);

    public static Greet greet() {
        return GREET_API;
    }

}

请求

YeahApi.greet().create("Hello world!", new Callback<Void>() {
    @Override
    public void success(Void aVoid, Response response) {
        // ...
    }

    @Override
    public void failure(RetrofitError error) {
        // ...
    }
});