HTTP GET 与请求正文改造

2022-09-01 06:57:46

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

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

我收到错误消息

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

你有什么想法吗?


答案 1

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

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

然而,正如这个SO答案中所说,GET的服务器语义受到限制,使得主体(如果有的话)对请求没有语义意义 - Roy Fielding。


答案 2

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

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