web-dev-qa-db-ja.com

要求本体RETROFITを使用したHTTP GET

Retrofitを使用してAndroidアプリケーションでAPI呼び出しを行います。JSONの@Bodyを送信する必要があります

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

エラーメッセージが表示されます

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

何かご存知ですか?

21
user2026760

Get Requestとともにデータを送信するには、次のことができます。

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

これで述べたように、 SO回答 、しかし、GETのサーバーセマンティクスは、もしあればボディがリクエストに対してセマンティックな意味を持たないように制限されています-Roy Fielding。

11
harshitpthk

この回答の here で説明されているGETの定義では、ボディは何も意味するものではないため、Retrofitではボディを追加できません。とはいえ、サーバーがこの形式に従うことは事実ではありません。サーバーが本体を取得するだけでなく、必要とするGETエンドポイントを持つことは完全に可能です。それは「悪い」アーキテクチャですが、Retrofitがライブラリが不必要にできることを制限するのは少しばかげているようです。

さらに、さまざまなHTTPメソッドには、何を行うべきかについて異なる定義があります。たとえば、GETは情報を取得し、POSTはサーバーに情報を提供して新しいエントリ/オブジェクトを作成し、PUTは既存のエントリ/オブジェクトを更新します。問題は、渡す最も簡単な方法です特にレトロフィットを使用する場合、サーバーに複雑なデータを送信するにはJSONを使用するため、複雑なフィルターを提供しながらサーバーから情報を取得する理想的な方法は、GET要求とともにJSON本体を送信することです。仕様の下でこれを可能にするリクエストメソッド。

8
Guybrush

このエラーは、APIが@POSTを必要とし、@ GETを使用する場合にも発生します

1
satyender