我正在使用Retrofit在Android应用程序中进行API调用。我必须提交一个JSON的@Body。
@GET("api/")
void getData(@Body UserPostRequestBody request)
我收到错误信息
retrofit.RetrofitError: apiCall: Non-body HTTP method cannot contain @Body or @TypedOutput.
你有什么想法吗?
我正在使用Retrofit在Android应用程序中进行API调用。我必须提交一个JSON的@Body。
@GET("api/")
void getData(@Body UserPostRequestBody request)
我收到错误信息
retrofit.RetrofitError: apiCall: Non-body HTTP method cannot contain @Body or @TypedOutput.
你有什么想法吗?
如此解释,GET方法不应该包含请求体,因此Retrofit不允许添加请求体。但是,服务器并不一定要遵循这个规范。服务器完全可以拥有一个GET端点,并且不仅接受请求体,而且要求请求体。尽管这样的架构不够优秀,但是限制Retrofit的功能似乎有些无谓。
此外,不同的HTTP方法有着不同的定义。例如,GET用于获取信息,POST通过向服务器提供信息创建新条目/对象,PUT用于更新现有的条目/对象等。问题在于,传递复杂数据到服务器的最简单方式,特别是使用Retrofit时,是使用JSON。因此,在提供复杂过滤器的同时从服务器获取信息的理想方式是发送带有JSON请求体的GET请求。不幸的是,根据规范,没有HTTP请求方法允许这样做。
要在Get请求
中发送数据,您可以采取以下措施:
//sending data as a url parameter
@GET("/group/{id}/users")
List<User> groupList(@Path("id") int groupId);
正如在这个答案中所说的那样,GET方法对于服务器的语义是受限制的,因此,如果有请求体(request body),也没有语义上的意义- Roy Fielding。
GET调用不接受请求体,请使用Query("key")
或Path("key")
只有POST方法接受请求体
@POST("api/") void getData(@Body UserPostRequestBody request)
https://myserverdomain.com?somebody[property1]=value
。特别是在Retrofit中,您可以这样定义它:Observable<Response<SomeClass>> someMethod(@Query("somebody[property1]") int property1);
如果你正在请求Rails服务器,那么这个方法至少可以工作。希望这个答案能帮到某些人。
使用GET请求发送正文的方法:
@HTTP(method = "GET", path = "api/users", hasBody = true)
Observable<JobDeleteResponseModel> jobDelete(@Body UserPostRequestBody body);
如文章所述
@HTTP
和hasBody = true
仅仅是防止异常发生,但仍显示相同的错误method GET must not have a request body
。 - Sumit Jain