我正在尝试使用改造2.0来实现一个库系统。它可以添加图书、列出所有图书信息、列出一个图书信息、删除一本图书、删除所有图书、更新一个图书信息。
我的baseurl结尾有一个“/”:
http://www.example.com/webservice/
前三个功能非常有效:
@GET("books")
Call<ArrayList<Book>> listBooks();
@POST("books")
Call<Book> addBook(@Body Book book);
@GET("books/{id}")
Call<Book> getBookInfo(@Path("id") int bookId);
然而,这三个根本不起作用:
@DELETE("books/{id}")
Call<Void> deleteBook(@Path("id") int bookId);
@PUT("books/{id}")
Call<Book> updateBook(@Path("id") int bookId , @Body Book book);
@DELETE("clean")
Call<Void> deleteAll();
例如,这是我的deletebook功能:
Gson gson = new GsonBuilder()
.setDateFormat(Constant.DATE_FORMAT)
.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Constant.BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
LibraryService libraryServiceAPI = retrofit.create(LibraryService.class);
Call<Void> deleteBookCall = libraryServiceAPI.deleteBook(bookId);
deleteBookCall.enqueue(new Callback<Void>() {
@Override
public void onResponse(Call<Void> call, Response<Void> response) {
if (response.isSuccessful()) {
if (response.code() == 204) { // I get 200 here, not 204
// but this is what I find:
// response-->rawResponse-->request-->method == "GET"
// This should be DELETE, am I right?
}
} else {
Log.d(DELETE_BOOK_ERROR, String.valueOf(response.code()));
}
}
@Override
public void onFailure(Call<Void> call, Throwable t) {
Log.d(DELETE_BOOK_ERROR, RESPONSE_FAILURE);
}
});
调试数据时:我发现response-->rawresponse-->request-->method==“get”,在本例中应该是“delete”。在我实现了updatebook和deleteallfeatures之后,我发现它们有相同的问题,这里的方法都是“get”而不是“put”和“delete”。
有人能帮我理解为什么会这样吗?谢谢。
更新1:添加调试信息截图。
您将在响应中看到,检查请求信息,方法是“get”,但标记显示method=“delete”。
更新2:根据dexter的建议,我添加了httplogginginterceptor进行调试,
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.interceptors().add(logging);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Constant.BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(httpClient.build()).build();
这里有两块原木: @GET("books/{id}") Call<Book> getBookInfo(@Path("id") int bookId);
这是正确的。
03-28 00:26:00.842 3171-3198/com.xiaoyaowrm.prolificlibrary d/okhttp:-->获取http://www.example.com/56eb7034cada930009ab0998/books/2 http/1.1 03-28 00:26:00.842 3171-3198/com.xiaoyaworm.prolificlibrary d/okhttp:-->结束获取03-28 00:26:01.038 3171-3198/com.xiaoyaworm.prolificlibrary d/okhttp:<--200确定http://www.example.com/56eb7034cada930009ab0998/books/2/ (191ms)03-28 00:26:01.038 3171-3198/com.xiaoyaworm.prolificlibrary d/okhttp:连接:保持活动03-28 00:26:01.038 3171-3198/com.xiaoyaworm.prolificlibrary d/okhttp:服务器:gunicorn/18.0 03-28 00:26:01.038 3171-3198/com.xiaoyaworm.prolificlibrary d/okhttp:日期:周一,2016年3月28日06:03:30 gmt 03-28 00:26:01.038 3171-3198/com.xiaoyaworm.prolificlibrary d/okhttp:content type:application/json 03-28 00:26:01.038 3171-3198/com.xiaoyaworm.prolificlibrary d/okhttp:content length:153 03-28 00:26:01.038 3171-3198/com.xiaoyaworm.prolificlibrary d/okhttp:via:1.1 vegur 03-28 00:26:01.0383171-3198/com.xiaoyaworm.prolificlibrary d/okhttp:okhttp发送millis:1459139160940 03-28 00:26:01.038 3171-3198/com.xiaoyaworm.prolificlibrary d/okhttp:okhttp接收millis:1459139161040 03-28 00:26:01.038 3171-3198/com.xiaoyaworm.prolificlibrary d/okhttp:{“author”:“123”,“categories”:“123”,“id”:2,“lastcheckedout”:null,“lastchedoutby”:null,“publisher”:“123”,“title”:“123”,“url”:“/books/2/”}03-28 00:26:01.038 3171-3198/com.xiaoyaworm.prolificlibrary d/okhttp:<--结束http(153字节正文)03-28 00:26:01.038 3171-3171/com.xiaoyaworm.prolificlibrary d/book 信息 响应 代码:响应状态代码:200 @DELETE("books/{id}") Call<Void> deleteBook(@Path("id") int bookId);
这是不正确的。
03-28 00:26:35.602 3171-3198/com.xiaoyaowrm.prolificlibrary d/okhttp:-->删除http://www.example.com/56eb7034cada930009ab0998/books/2 http/1.1 03-28 00:26:35.602 3171-3198/com.xiaoyaworm.prolificlibrary d/okhttp:-->结束删除03-28 00:26:36.082 3171-3198/com.xiaoyaworm.prolificlibrary d/okhttp:<--200确定http://www.example.com/56eb7034cada930009ab0998/books/2/ (481ms)03-28 00:26:36.082 3171-3198/com.xiaoyaworm.prolificlibrary d/okhttp:连接:保持活动03-28 00:26:36.082 3171-3198/com.xiaoyaworm.prolificlibrary d/okhttp:服务器:gunicorn/18.0 03-28 00:26:36.082 3171-3198/com.xiaoyaworm.prolificlibrary d/okhttp:日期:周一,2016年3月28日06:04:05 gmt 03-28 00:26:36.082 3171-3198/com.xiaoyaworm.prolificlibrary d/okhttp:content type:application/json 03-28 00:26:36.082 3171-3198/com.xiaoyaworm.prolificlibrary d/okhttp:content length:153 03-28 00:26:36.082 3171-3198/com.xiaoyaworm.prolificlibrary d/okhttp:via:1.1 vegur 03-28 00:26:36.0823171-3198/com.xiaoyaworm.prolificlibrary d/okhttp:okhttp发送millis:1459139195900 03-28 00:26:36.082 3171-3198/com.xiaoyaworm.prolificlibrary d/okhttp:okhttp接收millis:1459139196088 03-28 00:26:36.082 3171-3198/com.xiaoyaworm.prolificlibrary d/okhttp:{“author”:“123”,“categories”:“123”,“id”:2,“lastcheckedout”:null,“lastchedoutby”:null,“publisher”:“123”,“title”:“123”,“url”:“/books/2/”}03-28 00:26:36.082 3171-3198/com.xiaoyaworm.prolificlibrary d/okhttp:<--end http(153字节正文)
1条答案
按热度按时间rsaldnfx1#
我自己找到答案。这是一个愚蠢的错误…..当我调试我的响应消息时,我发现在我的delete and put方法中,response-->rawresponse-->priorresponse:response{protocol=http/1.1,code=301,message=moved permanually,url=http://www.example.com/56eb7034cada930009ab0998/clean}
在正确的get函数中,priorresponse为null。我阅读了http的基本信息,发现
如果客户机向“/testdir/”发出get请求(即,在目录处)………值得注意的是,如果客户机向“/testdir”发出get请求(不指定目录路径“/”),服务器将返回一个“301永久移动”,新的“位置”为“/testdir/”,如下所示。
加上这个“/”作为我的删除结束,把接口网址,现在所有的功能都在工作!!!有趣的是,在chrome plugin-->高级rest客户端中,我最终不需要这个“/”来让它工作。
我现在更新的接口代码为: