Reformation2.0删除,放置不起作用

ecr0jaav  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(315)

我正在尝试使用改造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字节正文)

rsaldnfx

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客户端中,我最终不需要这个“/”来让它工作。
我现在更新的接口代码为:

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

相关问题