带有请求正文 RETROFIT 的 HTTP GET
HTTP GET with request body RETROFIT
我正在使用 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 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 端点,它不仅需要,而且需要一个主体。这将是 "bad" 架构,但 Retrofit 限制库可以做的不必要的事情似乎有点愚蠢。
此外,各种 HTTP 方法对于它们应该做什么有不同的定义。例如,GET 获取信息,POST 通过向服务器提供信息创建新的 entry/object,PUT 更新现有的 entry/object 等。问题是,传递复杂信息的最简单方法数据到服务器,尤其是在使用改造时,是通过使用 JSON。因此,在提供复杂过滤器的同时从服务器获取信息的理想方式是发送 JSON 正文以及 GET 请求。不幸的是,规范中没有允许这样做的 HTTP 请求方法。
当 API 需要 @POST 并且您正在使用 @GET
时也会发生此错误
要在 GET 请求中发送正文,请使用:
@HTTP(method = "GET", path = "api/users", hasBody = true)
Observable<JobDeleteResponseModel> jobDelete(@Body UserPostRequestBody body);
如本文所述
如果您需要发送的请求正文不是很复杂,您还可以将查询参数指定为 https://myserverdomain.com?somebody[property1]=value
,特别是在改造时,您可以这样定义它:
Observable<Response<SomeClass>> someMethod(@Query("somebody[property1]") int property1);
如果您向 rails 服务器请求,那至少会起作用希望这个答案对某人有所帮助
GET 调用不接受正文使用 Query("key")
或 Path("key")
只有 POST 方法接受 Body
@POST("api/") void getData(@Body UserPostRequestBody request)
我正在使用 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 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 端点,它不仅需要,而且需要一个主体。这将是 "bad" 架构,但 Retrofit 限制库可以做的不必要的事情似乎有点愚蠢。
此外,各种 HTTP 方法对于它们应该做什么有不同的定义。例如,GET 获取信息,POST 通过向服务器提供信息创建新的 entry/object,PUT 更新现有的 entry/object 等。问题是,传递复杂信息的最简单方法数据到服务器,尤其是在使用改造时,是通过使用 JSON。因此,在提供复杂过滤器的同时从服务器获取信息的理想方式是发送 JSON 正文以及 GET 请求。不幸的是,规范中没有允许这样做的 HTTP 请求方法。
当 API 需要 @POST 并且您正在使用 @GET
时也会发生此错误要在 GET 请求中发送正文,请使用:
@HTTP(method = "GET", path = "api/users", hasBody = true)
Observable<JobDeleteResponseModel> jobDelete(@Body UserPostRequestBody body);
如本文所述
如果您需要发送的请求正文不是很复杂,您还可以将查询参数指定为 https://myserverdomain.com?somebody[property1]=value
,特别是在改造时,您可以这样定义它:
Observable<Response<SomeClass>> someMethod(@Query("somebody[property1]") int property1);
如果您向 rails 服务器请求,那至少会起作用希望这个答案对某人有所帮助
GET 调用不接受正文使用
Query("key")
或Path("key")
只有 POST 方法接受 Body
@POST("api/") void getData(@Body UserPostRequestBody request)