我正在使用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.
你知道吗?
要与Get Request
一起发送数据,您可以执行以下操作:
//sending data as a url parameter
@GET("/group/{id}/users")
List<User> groupList(@Path("id") int groupId);
正如在这个SO answer中所说的那样,GET的服务器语义受到限制,使得一个主体(如果有的话)对请求 - Roy Fielding没有语义含义。
在这个答案中here解释的GET的定义解释了身体不应该意味着任何东西,因此Retrofit不允许你添加身体。也就是说,服务器不遵循这种格式是不正确的。服务器完全有可能拥有一个不仅需要,而且需要一个正文的GET端点。这将是“糟糕”的架构,但Retrofit限制库可以不必要地做什么似乎有点愚蠢。
此外,各种HTTP方法对它们所支持的内容有不同的定义。例如,GET获取信息,POST通过向服务器提供信息来创建新条目/对象,PUT更新现有条目/对象等。问题是,将复杂数据传递到服务器的最简单方法,尤其是在使用时改造,是通过使用JSON。因此,在提供复杂过滤器的同时从服务器获取信息的理想方式是发送JSON主体以及GET请求。不幸的是,没有HTTP请求方法允许在规范下进行此操作。
当API需要@POST并且您使用@GET时,也会发生此错误
要在GET请求中发送正文,请使用:
@HTTP(method = "GET", path = "api/users", hasBody = true)
Observable<JobDeleteResponseModel> jobDelete(@Body UserPostRequestBody body);
正如在这个post中描述的那样