其实retrofit支持GET, POST, PUT, DELETE, and HEAD这五种请求方式,上一篇(http://blog.csdn.net/u013795543/article/details/57084232)简单地展示了一般的get请求以及@PATH设置url参数。
1、@Query设置URL参数
利用@PATH可以通过占位符的方式实现路径参数的填补,那么@Query则可以实现路径的键值对参数,比如下面:
baseurl/users?name=username
上面的路径可以通过@GET(“users?name=username”)实现,当然啦,为了重用性,最好还是下面这样:
@GET("users")
Call<List<User>> getUsersByName(@Query("name") String username);
然后在调用接口时把这个usename传进去就行了
如果有多个键值对的,那么可以使用集合了:
@GET("users")
Call<List<User>> groupList(@QueryMap Map<String, String> options);
也可以来个组合的,比如这样:
baseurl/group/id/users?sort=sortId
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);
2、post特例
上面主要介绍了get请求,其实也都适用于post请求,值得一提的,post还有一些特殊的用法,比如上传表单、文件等。
(1)@Body设置请求体
@Body后面跟的可以是String也可以是一个实体类,如果传入的是实体类,还是需要addConverterFactory方法(这个方法既可以将request进行转化,也可以对返回的response进行转化)将实体类转化为String进行请求,最后的请求形式还是表单形式。比如:
baseurl/users?name=”axiba”&gender=“male”&age=12
@POST("users/new")
Call<User> createUser(@Body User user);
上面的name=”axiba”&gender=“male”&age=12是从User实体类解析出来的。
(2)@Part、@Field设置表单
@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
(3)混合型@Multipart
@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);
3、遇到的坑
(1)onFailure(),,Failed to invoke public com.squareup.okhttp.ResponseBody() with no args,错误代码如下
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
t.printStackTrace();
Log.i(TAG, "onFailure(),," + t.getMessage());
}
});
这个是由于在callback处理时泛型参数写错了,由于Retrofit是restful的,这就需要callback的类型必须和请求实际返回的数据一致,所以这里的ResponseBody要改为对应的javaBean。
参考文章:Retrofit项目官方文档