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

Я пытаюсь выполнить 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>() {
        // ...
    }
)

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

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

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

Ответ 1

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

Что происходит, так это то, что вы дважды задаете тип содержимого. Затем вы передаете 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);