繁体   English   中英

带有请求正文 RETROFIT 的 HTTP GET

[英]HTTP GET with request body 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.

你有什么想法吗?

要将数据与您的Get Request一起发送,您可以执行以下操作:

//sending data as a url parameter
@GET("/group/{id}/users")
List<User> groupList(@Path("id") int groupId);

正如此SO answer 中所述,GET 的服务器语义受到限制,因此主体(如果有)对请求 Roy Fielding 没有语义意义。

GET作为解释的定义在这里在这个答案解释说,身体是不应该意味着什么,所以改造不允许添加的身体。 也就是说,服务器必须遵循这种格式是不正确的。 服务器完全有可能拥有一个不仅需要而且需要一个主体的 GET 端点。 这将是“糟糕”的架构,但对于 Retrofit 来说,限制库可以做的不必要的事情似乎有点愚蠢。

此外,各种 HTTP 方法对于它们应该做什么有不同的定义。 例如,GET 获取信息,POST 通过向服务器提供信息来创建新条目/对象,PUT 更新现有条目/对象等。问题是,将复杂数据传递给服务器的最简单方法,尤其是在使用改造,是通过使用 JSON。 因此,在提供复杂过滤器的同时从服务器获取信息的理想方法是将 JSON 正文与 GET 请求一起发送。 不幸的是,在规范下没有允许这样做的 HTTP 请求方法。

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

如果您需要发送的请求正文不是很复杂,您还可以将查询参数指定为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)

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

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

如在此描述的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM