简体   繁体   English

改装2.0删除,放置不起作用

[英]Retrofit 2.0 delete, put are not working

I am giving a try to use Retrofit 2.0 to implement a library system. 我正在尝试使用Retrofit 2.0实现图书馆系统。 Which can add book, list all book info, list one book info, delete one book, delete all books, update one book info. 可以添加书籍,列出所有书籍信息,列出一本书信息,删除一本书,删除所有书籍,更新一本书信息。

My baseURL has a ' / ' in its end: 我的baseURL的末尾有一个' / ':

http://www.example.com/webservice/

The first three features work very well: 前三个功能运作良好:

@GET("books")
Call<ArrayList<Book>> listBooks();

@POST("books")
Call<Book> addBook(@Body Book book);

@GET("books/{id}")
Call<Book> getBookInfo(@Path("id") int bookId);

However, those three don't work at all: 但是,这三个根本不起作用:

@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();

For example, this is my deleteBook feature: 例如,这是我的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);
    }
});

When I debug the data: I find response-->rawResponse-->request-->method == "GET", which should be "DELETE" in this example. 当我调试数据时:找到响应-> rawResponse->请求->方法==“ GET”,在此示例中应为“ DELETE”。 After I implement updateBook and deleteAll features, I find they have the same problem, here the methods both equals to "GET" rather than "PUT" and "DELETE". 实现updateBook和deleteAll功能后,我发现它们具有相同的问题,这里的方法都等于“ GET”,而不是“ PUT”和“ DELETE”。

Can Someone help me to understand why it happens like this? 有人可以帮我理解为什么会这样吗? Thanks a lot. 非常感谢。

Update 1: Add screenshot of debug info. 更新1:添加调试信息的屏幕快照。 响应实例

接口

deleteBook函数,突出显示响应实例

You will see in the response, check the request info, method is "GET", but tag shows method = "DELETE". 您将在响应中看到,检查请求信息,方法为“ GET”,但标签显示方法=“ DELETE”。

Update2: With suggestion from Dexter, I add the HttpLoggingInterceptor for debugging, 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();

Here are two pieces of log: 这是两个日志:

  1. @GET("books/{id}") Call<Book> getBookInfo(@Path("id") int bookId); which is correct. 哪个是对的。

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: Connection: keep-alive 03-28 00:26:01.038 3171-3198/com.xiaoyaoworm.prolificlibrary D/OkHttp: Server: gunicorn/18.0 03-28 00:26:01.038 3171-3198/com.xiaoyaoworm.prolificlibrary D/OkHttp: Date: Mon, 28 Mar 2016 06:03:30 GMT 03-28 00:26:01.038 3171-3198/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.prolific 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 library 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: {"author": "123", "categories": "123", "id": 2, "lastCheckedOut": null, "lastCheckedOutBy": null, "publisher": "123", "title": "123", "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 response code: Response status code: 200 库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); which is not correct. 这是不正确的。

03-28 00:26:35.602 3171-3198/com.xiaoyaoworm.prolificlibrary D/OkHttp: --> DELETE http://www.example.com/56eb7034cada930009ab0998/books/2 http/1.1 03-28 00:26:35.602 3171-3198/com.xiaoyaoworm.prolificlibrary D/OkHttp: --> END DELETE 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: Connection: keep-alive 03-28 00:26:36.082 3171-3198/com.xiaoyaoworm.prolificlibrary D/OkHttp: Server: gunicorn/18.0 03-28 00:26:36.082 3171-3198/com.xiaoyaoworm.prolificlibrary D/OkHttp: Date: Mon, 28 Mar 2016 06:04:05 GMT 03-28 00:26:36.082 3171-3198/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.pr 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 olificlibrary 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: {"author": "123", "categories": "123", "id": 2, "lastCheckedOut": null, "lastCheckedOutBy": null, "publisher": "123", "title": "123", "url": "/books/2/"} 03-28 00:26:36.082 3171-3198/com.xiaoyaoworm.prolificlibrary D/OkHttp: <-- END HTTP (153-byte body) 图书馆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字节的正文)

I find the answer on my own. 我自己找到答案。 This is a stupid mistake.....When I debug my response message, I find in my delete and put method, reponse--> rawResponse--> priorResponse: Response{protocol=http/1.1, code=301, message=MOVED PERMANENTLY, url= http://www.example.com/56eb7034cada930009ab0998/clean } 这是一个愚蠢的错误.....当我调试响应消息时,我在删除和放置方法中找到了响应-> rawResponse-> PriorResponse: Response {protocol = http / 1.1,code = 301,message =永久移动,网址= http://www.example.com/56eb7034cada930009ab0998/clean }

In my correct get function, priorResponse is null. 在我正确的get函数中,priorResponse为null。 I read HTTP basic information there, finding 我在那里阅读了HTTP基本信息,发现

If a client issues a GET request to "/testdir/" (ie, at the directory).......It is interesting to take note that if a client issue a GET request to "/testdir" (without specifying the directory path "/"), the server returns a "301 Move Permanently" with a new "Location" of "/testdir/", as follows. 如果客户端向“ / testdir /”发出GET请求(即,在目录中).......有趣的是,如果客户端向“ / testdir”发出了GET请求(未指定目录路径“ /”),服务器将返回“ 301永久移动”,新的“位置”为“ / testdir /”,如下所示。

After adding this "/" as end in my DELETE, PUT interface url, now all the features are working!!! 在我的DELETE,PUT接口网址中添加此“ /”作为结尾之后,现在所有功能都可以使用!!! Interesting that in chrome plugin--> Advanced Rest Client, I don't need this "/" in the end to make it work. 有趣的是,在chrome插件-> Advanced Rest Client中,我最后不需要此“ /”即可使其正常工作。

My updated interface code now as: 我更新的界面代码现在为:

@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