POST Retrofitライブラリを使用してJSONObjectをしようとしていますが、受信側でリクエストを確認すると、content-lengthは0
。
RestServiceインターフェース:
@Headers({
"Content-type: application/json"
})
@POST("/api/v1/user/controller")
void registerController(
@Body JSONObject registrationBundle,
@Header("x-company-device-token") String companyDeviceToken,
@Header("x-company-device-guid") String companyDeviceGuid,
Callback<JSONObject> cb);
そして呼ばれます
mRestService.registerController(
registrationBundle,
mApplication.mSession.getCredentials().getDeviceToken(),
mApplication.mSession.getCredentials().getDeviceGuid(),
new Callback<JSONObject>() {
// ...
}
)
そして、registrationBundle
であるJSONObject
がnullでも空でもないことは確かです(他のフィールドは確かに問題ありません)。リクエストが行われた瞬間、次のようにログアウトします:{"Zip":19312,"useAccountZip":false,"controllerName":"mine","registrationCode":"GLD94Q"}
。
リクエストの受信側で、リクエストにContent-type: application/json
ありますがContent-length: 0
。
このように本文でJSONを送信できない理由はありますか?レトロフィットを使用するときに簡単なものがないのですか?
デフォルトでは、JSONリクエストの本文が必要な場合はヘッダーを設定する必要はありません。 Retrofitコードをテストするときはいつでも、RestAdapterのインスタンスに.setLogLevel(RestAdapter.LogLevel.FULL)
を設定することをお勧めします。これにより、完全な要求ヘッダーと本文、および完全な応答ヘッダーと本文が表示されます。
発生しているのは、コンテンツタイプを2回設定していることです。次に、GsonConverterを介して渡され、{"nameValuePairs":YOURJSONSTRING}
のように変形されたJSONObjectを渡しています。ここで、YOURJSONSTRING
には、意図した完全なJSON出力が含まれています。明らかな理由により、これはほとんどのREST APIでうまく機能しません。
デフォルトですでにUTF-8でJSONに設定されているContent-typeヘッダーをいじるのはスキップしてください。また、JSONObjectをGSONに渡さないでください。 GSONが変換するJavaオブジェクトを渡します。
コールバックを使用している場合は、これを試してください。
@POST("/api/v1/user/controller")
void registerController(
@Body MyBundleObject registrationBundle,
@Header("x-company-device-token") String companyDeviceToken,
@Header("x-company-device-guid") String companyDeviceGuid,
Callback<ResponseObject> cb);
私はこの正確な構文をテストしていません。
同期の例:
@POST("/api/v1/user/controller")
ResponseObject registerController(
@Body MyBundleObject registrationBundle,
@Header("x-company-device-token") String companyDeviceToken,
@Header("x-company-device-guid") String companyDeviceGuid);