【问题标题】:Android Retrofit return status 500 internal server errorAndroid Retrofit 返回状态 500 内部服务器错误
【发布时间】:2014-05-17 04:26:05
【问题描述】:

我正在像这样使用 Retrofit 来获取所有书籍并删除所有书籍。

 @GET("/books")
    BookListResponse getAllBooks();
    @DELETE("/clean")
    Response deleteAllBooks();

但返回了错误状态 500(内部服务器错误)。 我使用 Chrome restful 客户端应用程序测试了这两个 restful 调用,它们工作正常。

但是,如果我只想像这样获取一本书或删除一本书

 @GET("books/1")
    BookResponse getOneBook();
    @DELETE("books/1")
    Response deleteOneBook();

它们可以正常工作。

所以我不确定这是服务器问题还是我遗漏了什么?

【问题讨论】:

  • 即使你错过了什么,服务器端代码也不应该中断。显然这是一个服务器端错误。

标签: android rest retrofit


【解决方案1】:

这只是语义问题:当你对服务器说“请删除书”,但你没有说要删除哪本书时,服务器不知道该怎么做(当你向 /books 发送 DELETE)。因此出现错误 500。但是当您说“请删除 id 为 1 的书”时,现在服务器知道该做什么(当您向 /books/1 发送 DELETE 时会发生这种情况)。

如果您像这样设置您的服务器,那么以这种方式工作是可以的,但我从未见过任何 REST 服务可以删除特定模型的所有记录。同样,如果您以这种方式编码您的服务器是可以的,只需确保请求以您想要的方式到达服务器。

毕竟,如果您收到错误 500,请检查您的服务器。问题肯定不在 Android 端。

【讨论】:

  • 嗨,我通过在请求中添加一个接受标头并将标头值设置为 application/json 来解决它。服务器 API 不是我写的,所以我无法控制它们。
  • 投票支持精彩的解释。即使您遗漏了某些内容,服务器端代码也不应该中断。服务器端代码中存在错误。 api Guy 需要修复它。
  • 投票给精彩的解释
【解决方案2】:

只需在请求中添加 header 接受如下:

Request request = new Request.Builder()
                .url(urlString)
                .header("accept", "application/json")
                .build();

【讨论】:

    【解决方案3】:

    更新
    在 Retrofit 2.1 中,请求构建器已更改,因此您必须在改造接口方法中指定标头

    @Headers("Accept: application/json") @GET("products") Call<Products> getAllProducts();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 2013-07-24
      • 1970-01-01
      • 2015-03-24
      相关资源
      最近更新 更多