Retrofit 2.0 删除、放置都不起作用

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”。

有人可以帮助我理解为什么会这样吗?非常感谢。

更新 1:添加调试信息的屏幕截图。 响应实例

界面

deleteBook 函数,响应实例高亮显示

您将在响应中看到,检查请求信息,方法是“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)

下面是两段日志:

  1. @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

  1. @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 字节正文)

xia*_*orm 5

我自己找到了答案。这是一个愚蠢的错误.....当我调试我的响应消息时,我发现在我的删除和放置方法中,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)