带有请求正文 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)