2015-04-23 114 views
14

我正在使用Retrofit在我的Android應用程序中進行api調用。 我必須提交JSONHTTP GET與請求正文RETROFIT

@GET("api/") 
void getData(@Body UserPostRequestBody request) 

的@Body我遇到錯誤信息

retrofit.RetrofitError: apiCall: Non-body HTTP method cannot contain @Body or @TypedOutput. 

你有什麼想法?

+6

您需要將註釋更改爲@POST – Tarun

+1

@ user2026760,您是否必須對正文使用GET請求?如果你這樣做,你可以創建自己的註釋,並讓它在獲取請求中處理一個正文。不理想,但我確定有人在某處創建了一個可以實現這一點的服務器。我不得不提供一個有DELETE請求的機構,我不喜歡這樣做;但我已經完成了它們。 –

回答

6

要發送的數據連同您的Get Request,你可以做到以下幾點:

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

在本SO answer說,對於GET服務器語義,但被限制這樣一個機構,如果有的話,有沒有語義對請求的意義 - 羅伊·菲爾丁。

6

在此答案中解釋爲here的GET的定義解釋了身體不應該表示任何內容,因此Retrofit不允許您添加身體。也就是說,服務器不一定遵循這種格式。服務器完全有可能擁有一個GET端點,它不僅需要,而且需要一個主體。這將是「壞」架構,但對於改造來說,限制圖書館不必要的操作似乎有點愚蠢。

此外,各種HTTP方法對於它們所支持的內容具有不同的定義。例如,GET獲取信息,POST通過向服務器提供信息創建新的條目/對象,PUT更新現有的條目/對象等。問題是將複雜數據傳遞到服務器的最簡單方法,特別是在使用翻新,是通過使用JSON。因此,在提供複雜過濾器的同時從服務器獲取信息的理想方法是發送一個JSON正文和GET請求。不幸的是,在規範下沒有允許這樣做的HTTP請求方法。

+1

完全同意你@Guybrush。而且由於這種限制,我們選擇何時需要將複雜數據發送到來自服務器的GET信息,違反了REST約定並開始使用POST。 –