xia*_*orm 1 java android retrofit retrofit2
我正在尝试使用 Retrofit 2.0 来实现一个图书馆系统。可以添加书籍,列出所有书籍信息,列出一本书信息,删除一本书,删除所有书籍,更新一本书信息。
我的 baseURL 末尾有一个“ / ”:
http://www.example.com/webservice/
Run Code Online (Sandbox Code Playgroud)
前三个功能非常有效:
@GET("books")
Call<ArrayList<Book>> listBooks();
@POST("books")
Call<Book> addBook(@Body Book book);
@GET("books/{id}")
Call<Book> getBookInfo(@Path("id") int bookId);
Run Code Online (Sandbox Code Playgroud)
但是,这三个根本不起作用:
@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();
Run Code Online (Sandbox Code Playgroud)
例如,这是我的 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);
}
});
Run Code Online (Sandbox Code Playgroud)
当我调试数据时:我发现 response-->rawResponse-->request-->method == "GET",在这个例子中应该是 "DELETE"。在我实现updateBook和deleteAll功能后,我发现它们有同样的问题,这里的方法都等于“GET”而不是“PUT”和“DELETE”。
有人可以帮助我理解为什么会这样吗?非常感谢。
您将在响应中看到,检查请求信息,方法是“GET”,但标记显示方法 =“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();
Run Code Online (Sandbox Code Playgroud)
下面是两段日志:
@GET("books/{id}")
Call<Book> getBookInfo(@Path("id") int bookId);
哪个是正确的。03-28 00:26:00.842 3171-3198/com.xiaoyaoworm.prolificlibrary D/OkHttp: --> GET http://www.example.com/56eb7034cada930009ab0998/books/2 http/ 1.81:03-26 00.842 3171-3198 / com.xiaoyaoworm.prolificlibrary d / OkHttp: - > END GET 03-28 00:26:01.038 3171-3198 / com.xiaoyaoworm.prolificlibrary d / OkHttp:< - 200 OK 的http:// WWW .example.com/56eb7034cada930009ab0998/books/2/(191ms) 03-28 00:26:01.038 3171-3198/com.xiaoyaoworm.prolificlibrary D/OkHttp:连接:keep-alive 03-28 00:26:01.038 3171-3198/com.prolificlibraryD/OkHttp:服务器:gunicorn/18.0 03-28 00:26:01.038 3171-3198/com.xiaoyaoworm.prolificlibrary D/Okhttp:日期:2016 年 3 月 28 日星期一 06:03:30 GMT 03-28 00.07183-30 /com.xiaoyaoworm.prolificlibrary D/OkHttp: Content-Type: application/json 03-28 00:26:01.038 3171-3198/com.xiaoyaoworm.prolificlibrary D/OkHttp: Content-Length: 153 03-28: 00:26 01.038 3171-3198/com.xiaoyaoworm.prolificlibrary D/OkHttp: Via: 1.1 vegur 03-28 00:26:01.038 3171-3198/com.xiaoyaoworm.prolificlibrary Ok-S9010400400000000000000000000000000000000000000000000:26:01.038 3171-3171-3198 :26:01.038 3171-3198/com.xiaoyaoworm.prolificlibrary D/OkHttp: OkHttp-Received-Millis: 1459139161040 03-28 00:26:01。038 3171-3198/com.xiaoyaoworm.prolificlibrary D/OkHttp: {"author": "123", "categories": "123", "id": 2, "lastCheckedOut": null, "lastCheckedOutBy": null, "出版商”:“123”,“标题”:“123”,“网址”:“/books/2/”} 03-28 00:26:01.038 3171-3198/com.xiaoyaoworm.prolificlibrary D/OkHttp:<- - END HTTP (153-byte body) 03-28 00:26:01.038 3171-3171/com.xiaoyaoworm.prolificlibrary D/book info response code: Response status code: 200"url": "/books/2/"} 03-28 00:26:01.038 3171-3198/com.xiaoyaoworm.prolificlibrary D/OkHttp: <-- END HTTP (153-byte body) 03-28 00:26 :01.038 3171-3171/com.xiaoyaoworm.prolificlibrary D/book info 响应码: 响应状态码:200"url": "/books/2/"} 03-28 00:26:01.038 3171-3198/com.xiaoyaoworm.prolificlibrary D/OkHttp: <-- END HTTP (153-byte body) 03-28 00:26 :01.038 3171-3171/com.xiaoyaoworm.prolificlibrary D/book info 响应码: 响应状态码:200
@DELETE("books/{id}")
Call<Void> deleteBook(@Path("id") int bookId);
这是不正确的。03-28 00:26:35.602 3171-3198/com.xiaoyaoworm.prolificlibrary D/Okhttp: --> 删除http://www.example.com/56eb7034cada930009ab0998/books/2 http/1.1: 003:--> 35.602 3171-3198/com.xiaoyaoworm.prolificlibrary D/Okhttp: --> END DELETE 03-28 00:26:36.082 3171-3198/com.xiaoyaoworm.prolificlibrary D/Okhttp :// OK2000: <- OK200 .example.com/56eb7034cada930009ab0998/books/2/(481ms) 03-28 00:26:36.082 3171-3198/com.xiaoyaoworm.prolificlibrary D/OkHttp:连接:keep-alive 03-28 00:26:36.082 3171-3198/com.xiaoyaowormHttp:keep-alive服务器:gunicorn/18.0 03-28 00:26:36.082 3171-3198/com.xiaoyaoworm.prolificlibrary D/Okhttp:日期:2016 年 3 月 28 日星期一 06:04:05 GMT 03-28 00.0783-13:13 /com.xiaoyaoworm.prolificlibrary D/OkHttp: Content-Type: application/json 03-28 00:26:36.082 3171-3198/com.xiaoyaoworm.prolificlibrary D/OkHttp: Content-Length: 153 03-28: 00:26 36.082 3171-3198/com.xiaoyaoworm.prolificlibrary D/OkHttp: Via: 1.1 vegur 03-28 00:26:36.082 3171-3198/com.xiaoyaoworm.prolificlibrary D/S901Http-S9010400000000000000003000 :26:36.082 3171-3198/com.xiaoyaoworm.prolificlibrary D/OkHttp: OkHttp-Received-Millis: 1459139196088 03-28 00:26:36。082 3171-3198/com.xiaoyaoworm.prolificlibrary D/OkHttp: {"author": "123", "categories": "123", "id": 2, "lastCheckedOut": null, "lastCheckedOutBy": null, "出版商”:“123”,“标题”:“123”,“网址”:“/books/2/”} 03-28 00:26:36.082 3171-3198/com.xiaoyaoworm.prolificlibrary D/OkHttp: <- - 结束 HTTP(153 字节正文)-- 结束 HTTP(153 字节正文)-- 结束 HTTP(153 字节正文)
我自己找到了答案。这是一个愚蠢的错误.....当我调试我的响应消息时,我发现在我的删除和放置方法中,reponse--> rawResponse-->priorResponse: Response{protocol=http/1.1, code=301, message=永久移动,url= http://www.example.com/56eb7034cada930009ab0998/clean }
在我正确的 get 函数中,priorResponse 为空。我在那里阅读了HTTP 基本信息,发现
如果客户端向“/testdir/”(即在目录中)发出 GET 请求.......有趣的是要注意,如果客户端向“/testdir”发出 GET 请求(没有指定目录路径“/”),服务器返回“301 Move Permanently”,新的“Location”为“/testdir/”,如下。
在我的 DELETE、PUT 接口 url 中添加这个“/”作为结尾后,现在所有功能都可以使用了!!!有趣的是,在 chrome plugin--> Advanced Rest Client 中,我最终不需要这个“/”来使其工作。
我现在更新的界面代码为:
@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();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9710 次 |
| 最近记录: |