簡體   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