簡體   English   中英

改裝2.0刪除,放置不起作用

[英]Retrofit 2.0 delete, put are not working

我正在嘗試使用Retrofit 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);
    }
});

當我調試數據時:找到響應-> rawResponse->請求->方法==“ GET”,在此示例中應為“ DELETE”。 實現updateBook和deleteAll功能后,我發現它們具有相同的問題,這里的方法都等於“ GET”,而不是“ PUT”和“ DELETE”。

有人可以幫我理解為什么會這樣嗎? 非常感謝。

更新1:添加調試信息的屏幕快照。 響應實例

接口

deleteBook函數,突出顯示響應實例

您將在響應中看到,檢查請求信息,方法為“ GET”,但標簽顯示方法=“ DELETE”。

Update2:根據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();

這是兩個日志:

  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.1 03-28 00: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.xiaoyaoworm.prolificlibrary D / 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:26:01.038 3171-3198 / com.xiaoyaoworm.prolificlibrary D / OkHttp:內容類型:application / json 03-28 00:26:01.038 3171-3198 / com.xiaoyaoworm.prolificlibrary D / OkHttp:內容-長度:153 03-28 00:26:01.038 3171-3198 / com.xiaoyaoworm.prolificlibrary D / OkHttp:通過:1.1 vegur 03-28 00:26:01.038 3171-3198 / com.xiaoyaoworm.prolific 庫D / OkHttp:OkHttp-Sent-Millis:1459139160940 03-28 00: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:{“作者”:“ 123”,“類別”:“ 123”,“ id”:2,“ lastCheckedOut”:null,“ lastCheckedOutBy”:null,“發布者”: “ 123”,“ title”:“ 123”,“ url”:“ / books / 2 /”} 03-28 00:26:01.038 3171-3198 / com.xiaoyaoworm.prolificlibrary D / OkHttp:<-END HTTP (153字節的正文)03-28 00:26:01.038 3171-3171 / com.xiaoyaoworm.prolificlibrary D / book信息響應代碼:響應狀態代碼: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 03-28 00:26: 35.602 3171-3198 / com.xiaoyaoworm.prolificlibrary D / OkHttp:->結束刪除03-28 00:26:36.082 3171-3198 / com.xiaoyaoworm.prolificlibrary D / OkHttp:<-200 OK http:// www .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.xiaoyaoworm.prolificlibrary D / OkHttp:服務器: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:26:36.082 3171-3198 / com.xiaoyaoworm.prolificlibrary D / OkHttp:內容類型:application / json 03-28 00:26:36.082 3171-3198 / com.xiaoyaoworm.prolificlibrary D / OkHttp:內容-長度:153 03-28 00:26:36.082 3171-3198 / com.xiaoyaoworm.prolificlibrary D / OkHttp:通過:1.1 vegur 03-28 00:26:36.082 3171-3198 / com.xiaoyaoworm.pr 圖書館D / OkHttp:OkHttp-Sent-Millis:1459139195900 03-28 00: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:{“作者”:“ 123”,“類別”:“ 123”,“ id”:2,“ lastCheckedOut”:null,“ lastCheckedOutBy”:null,“發布者”: “ 123”,“ title”:“ 123”,“ url”:“ / books / 2 /”} 03-28 00:26:36.082 3171-3198 / com.xiaoyaoworm.prolificlibrary D / OkHttp:<-END HTTP (153字節的正文)

我自己找到答案。 這是一個愚蠢的錯誤.....當我調試響應消息時,我在刪除和放置方法中找到了響應-> rawResponse-> PriorResponse: Response {protocol = http / 1.1,code = 301,message =永久移動,網址= http://www.example.com/56eb7034cada930009ab0998/clean }

在我正確的get函數中,priorResponse為null。 我在那里閱讀了HTTP基本信息,發現

如果客戶端向“ / testdir /”發出GET請求(即,在目錄中).......有趣的是,如果客戶端向“ / testdir”發出了GET請求(未指定目錄路徑“ /”),服務器將返回“ 301永久移動”,新的“位置”為“ / testdir /”,如下所示。

在我的DELETE,PUT接口網址中添加此“ /”作為結尾之后,現在所有功能都可以使用!!! 有趣的是,在chrome插件-> 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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM