HTTP GET请求正文RETROFIT

时间:2015-04-23 21:49:26

标签: java android get retrofit

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

你有什么想法吗?

6 个答案:

答案 0 :(得分: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没有语义含义。

答案 1 :(得分:7)

在这个答案中解释为here的GET的定义解释了一个身体不应该意味着什么,所以Retrofit不允许你添加一个身体。也就是说,服务器不遵循这种格式是不正确的。服务器完全有可能拥有一个不仅需要,而且需要一个正文的GET端点。这将是&#34;坏&#34;体系结构,但Retrofit限制库可以不必要地做什么似乎有点傻。

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

如本post

中所述

答案 4 :(得分:0)

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

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

至少在您请求Rails服务器时它将起作用,希望此答案对某人有帮助

答案 5 :(得分:0)

  • GET 调用不接受正文使用 Query("key")Path("key")

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