HTTP GET请求正文RETROFIT

问题描述 投票:19回答:4

我正在使用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.

你知道吗?

java android get retrofit
4个回答
9
投票

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

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

正如在这个SO answer中所说的那样,GET的服务器语义受到限制,使得一个主体(如果有的话)对请求 - Roy Fielding没有语义含义。


8
投票

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

此外,各种HTTP方法对它们所支持的内容有不同的定义。例如,GET获取信息,POST通过向服务器提供信息来创建新条目/对象,PUT更新现有条目/对象等。问题是,将复杂数据传递到服务器的最简单方法,尤其是在使用时改造,是通过使用JSON。因此,在提供复杂过滤器的同时从服务器获取信息的理想方式是发送JSON主体以及GET请求。不幸的是,没有HTTP请求方法允许在规范下进行此操作。


1
投票

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


0
投票

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

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

正如在这个post中描述的那样

© www.soinside.com 2019 - 2024. All rights reserved.