请求方式
很简单,在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作为发起引擎就可以啦。