web-dev-qa-db-ja.com

POST改造を使用したボディJSON

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を送信できない理由はありますか?レトロフィットを使用するときに簡単なものがないのですか?

10
adityajones

デフォルトでは、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);
31
colintheshots