2015-04-23 149 views
14

我正在使用Retrofit在我的Android应用程序中进行api调用。 我必须提交JSONHTTP GET与请求正文RETROFIT

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

的@Body我遇到错误信息

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

你有什么想法?

+6

您需要将注释更改为@POST – Tarun

+1

@ user2026760,您是否必须对正文使用GET请求?如果你这样做,你可以创建自己的注释,并让它在获取请求中处理一个正文。不理想,但我确定有人在某处创建了一个可以实现这一点的服务器。我不得不提供一个有DELETE请求的机构,我不喜欢这样做;但我已经完成了它们。 –

回答

6

要发送的数据连同您的Get Request,你可以做到以下几点:

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

在本SO answer说,对于GET服务器语义,但被限制这样一个机构,如果有的话,有没有语义对请求的意义 - 罗伊·菲尔丁。

6

在此答案中解释为here的GET的定义解释了身体不应该表示任何内容,因此Retrofit不允许您添加身体。也就是说,服务器不一定遵循这种格式。服务器完全有可能拥有一个GET端点,它不仅需要,而且需要一个主体。这将是“坏”架构,但对于改造来说,限制图书馆不必要的操作似乎有点愚蠢。

此外,各种HTTP方法对于它们所支持的内容具有不同的定义。例如,GET获取信息,POST通过向服务器提供信息创建新的条目/对象,PUT更新现有的条目/对象等。问题是将复杂数据传递到服务器的最简单方法,特别是在使用翻新,是通过使用JSON。因此,在提供复杂过滤器的同时从服务器获取信息的理想方法是发送一个JSON正文和GET请求。不幸的是,在规范下没有允许这样做的HTTP请求方法。

+1

完全同意你@Guybrush。而且由于这种限制,我们选择何时需要将复杂数据发送到来自服务器的GET信息,违反了REST约定并开始使用POST。 –