我正在使用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.
你有什么想法吗?
答案 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)