POST-корпус JSON с использованием Retrofit

Я пытаюсь выполнить POST JSONObject с помощью библиотеки Retrofit, но когда я вижу запрос на принимающей стороне, длина содержимого равна 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>() { // ... } ) 

И я уверен, что JSONObject , который является JSONObject , не является нулевым или пустым (другие поля, конечно, прекрасны). В настоящий момент запрос выполнен, он выдается как: {"zip":19312,"useAccountZip":false,"controllerName":"mine","registrationCode":"GLD94Q"} .

На принимающей стороне запроса я вижу, что запрос имеет Content-type: application/json но имеет Content-length: 0 .

Есть ли причина, по которой отправка JSON в тело, как это, не работает? Я пропустил что-то простое в использовании Retrofit?

Solutions Collecting From Web of "POST-корпус JSON с использованием Retrofit"

По умолчанию вам не нужно устанавливать какие-либо заголовки, если вы хотите получить тело запроса JSON. Всякий раз, когда вы проверяете код Retrofit, я рекомендую установить .setLogLevel(RestAdapter.LogLevel.FULL) в вашем экземпляре RestAdapter. Это покажет вам полные заголовки запросов и тело, а также полные заголовки ответов и тело.

Что происходит, так это то, что вы дважды устанавливаете Content-type. Затем вы передаете JSONObject, который проходит через GsonConverter и искажен, чтобы выглядеть как {"nameValuePairs":YOURJSONSTRING} где YOURJSONSTRING содержит ваш полный, предназначенный JSON выход. По очевидным причинам это не будет работать с большинством API REST.

Вам следует пропустить messing с заголовком Content-type, который по умолчанию уже установлен в JSON с UTF-8. Кроме того, не передавайте JSONObject в GSON. Передайте объект Java для преобразования GSON.

Попробуйте это, если вы используете обратные вызовы:

 @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);