【问题标题】:HTTP GET with request body RETROFIT带有请求正文 RETROFIT 的 HTTP GET
【发布时间】:2015-07-02 07:38:19
【问题描述】:

我正在使用 Retrofit 在我的 android 应用程序中进行 api 调用。 我必须提交一个@Body of JSON

@GET("api/")
void getData(@Body UserPostRequestBody request)

我收到错误消息

retrofit.RetrofitError: apiCall: Non-body HTTP method cannot contain @Body or @TypedOutput.

你有什么想法吗?

【问题讨论】:

  • 你需要把注解改成@POST
  • @user2026760,您必须使用带有正文的 GET 请求吗?如果这样做,您可以创建自己的注释并让它处理获取请求中的正文。不理想,但我确信某个地方的某个人已经创建了一个可以做到这一点的服务器。我不得不向一个主体提供一个 DELETE 请求,我讨厌这样做;但我已经完成了。
  • 如何创建自定义注释?

标签: java android get retrofit


【解决方案1】:

要与您的Get Request 一起发送数据,您可以执行以下操作:

//sending data as a url parameter
@GET("/group/{id}/users")
List<User> groupList(@Path("id") int groupId);

正如SO answer 中所说,但是 GET 的服务器语义受到限制,因此主体(如果有)对请求没有语义意义 - Roy Fielding。

【讨论】:

  • 感谢您的回答。我只是将我的方法更改为 POST 并且它起作用了
【解决方案2】:

此答案中here 解释的 GET 定义解释了主体不应该意味着任何东西,因此 Retrofit 不允许您添加主体。也就是说,服务器必须遵循这种格式是不正确的。服务器完全有可能拥有一个不仅需要,而且还需要一个主体的 GET 端点。这将是“糟糕”的架构,但是对于 Retrofit 来说,限制库可以不必要地做的事情似乎有点愚蠢。

此外,各种 HTTP 方法对于它们应该做什么有不同的定义。例如,GET 获取信息,POST 通过向服务器提供信息来创建新条目/对象,PUT 更新现有条目/对象等。问题是,将复杂数据传递给服务器的最简单方法,尤其是在使用改造,是使用 JSON。因此,在提供复杂过滤器的同时从服务器获取信息的理想方法是将 JSON 正文与 GET 请求一起发送。不幸的是,规范中没有允许这样做的 HTTP 请求方法。

【讨论】:

  • 完全同意你@Guybrush。由于这个限制,当我们需要从服务器发送复杂数据以获取信息时,我们的选择是打破 REST 约定并开始使用 POST。
  • 我该如何解决改造的限制?有没有办法覆盖它?
【解决方案3】:

当 API 需要 @POST 并且您正在使用 @GET 时也会发生此错误

【讨论】:

    【解决方案4】:

    如果您需要发送的请求正文不是很复杂,您还可以将查询参数指定为https://myserverdomain.com?somebody[property1]=value,特别是在改造时您可以这样定义:

    Observable<Response<SomeClass>> someMethod(@Query("somebody[property1]") int property1);
    

    至少如果您向 Rails 服务器请求,这将起作用,希望这个答案对某人有所帮助

    【讨论】:

      【解决方案5】:
      • GET 调用不接受正文使用 Query("key")Path("key")

      • 只有 POST 方法接受正文 @POST("api/") void getData(@Body UserPostRequestBody request)

      【讨论】:

        【解决方案6】:

        要在 GET 请求中发送正文,请使用:

        @HTTP(method = "GET", path = "api/users", hasBody = true)
        Observable<JobDeleteResponseModel> jobDelete(@Body UserPostRequestBody body);
        

        post中所述

        【讨论】:

        • hasBody = true 放到 GET 方法会产生错误:方法 GET 不能有请求体
        • 通过使用@HTTP and hasBody = true 只是防止异常,但它仍然显示相同的错误method GET must not have a request body
        猜你喜欢
        • 2019-10-25
        • 1970-01-01
        • 2020-09-07
        • 2016-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-02
        相关资源
        最近更新 更多