Retrofit入门笔记二

请求方式

很简单,在API方法前加@GET,即说明该方法以get方式请求。HTTP/1.1协议中定义的八种方法都是支持的,灵活选用即可,此处不再赘述。

URL拼装

Retrofit提供了灵活定义request的方式,URL可使用注解+参数完成按自己逻辑的拼装。
除了上面的@PATH外,常用的还有:

@QUERY

用于拼装GET请求中请求参数,可以这么写(参考,下同)

//url = BASE_HOST + "/task?id=100"
@GET("/task")
Call<Task> getTask(@Query("id") long id);

如果是多个id,则用list传参即可

Call<List<Task>> getTask(@Query("id") List<Long> taskIds);

@BODY

支持将Bean直接作为参数传入RetroitAPI,默认的GsonConverter会反序列化对象,将其以json形式作为request-body发出。

public interface TaskService {  
    @POST("/tasks")
    Call<Task> createTask(@Body Task task);
}


public class Task {  
    public long id;
    public String text;
}

@FIELD/@FIELDMAP

主要使用在POST请求时,默认表单(x-www-form-urlencoded)时键值对参数的拼装。如下

public interface TaskService {  
    @FormUrlEncoded
    @POST("tasks")
    Call<Task> createTask(@Field("title") String title);
}

貌似也可以使用map,省的一个个添加key:

public interface UserService {  
    @FormUrlEncoded
    @PUT("user")
    Call<User> update(@FieldMap Map<String, String> fields);
}

Headers

使用Retrofit提供的@Header(s)可完成请求头的追加。

public interface TaskService { 
    @Headers("Cache-Control: max-age=640000")
    @POST("/tasks")
    Call<Task> createTask(@Body Task task);
}

或者使用大括号包含多个header

public interface TaskService { 
    @Headers({
        "Accept: application/json",
        "User-Agent: Your-App-Name"
    })
    @POST("/tasks")
    Call<Task> createTask(@Body Task task);
}

除此之外,使用OkHttp给我们带来的好处之一,就是方便的interceptor,可以在request发出之前任意的打造它,包括添加header。

okHttpClient.interceptors().add(new Interceptor() {  
    @Override
    public Response intercept(Interceptor.Chain chain) throws IOException {
        Request original = chain.request();

        Request.Builder requestBuilder = original.newBuilder().header("Accept","application/json").method(original.method(), original.body());
        Request request = requestBuilder.build();
        return chain.proceed(request);
    }
});

注意这里使用了header(key, val)方法,它会覆盖之前的key(如果有);你也可使用addHeader(key, val)纯粹地添加header。

同步和异步访问

类似OkHttp,Retrofit提供异步和同步两种访问发起方法(本来就是用的okhttp底层实现..),同步和异步方法分别名为execute/enqueue。
同步是阻塞等待返回结果,异步需要传入Callback回调方法等待response回调。

Other

Error Handle,利用responseBodyConverter,待写。
Log,发现了一个针对Okhttp提供的方便的log库,只要使用OkHttp的都能使用。只需要设置log-level,日志会根据内建的规则打印相对应的数据(内容丰富程度不同)。加入依赖:

compile 'com.squareup.okhttp3:logging-interceptor:3.2.0'  

使用时

HttpLoggingInterceptor logging = new HttpLoggingInterceptor();  
logging.setLevel(Level.BODY);
httpClient.addInterceptor(logging);

然后使用这个Cliet作为发起引擎就可以啦。