Модернизация необработанного тела струны POST

Я использую Retrofit для отправки запроса POST на сервер. Тело POST должно быть в форме jdata={"key1":"value1",...} вместе с заголовком Content-Type, установленным на application/x-www-form-urlencoded. Я нашел аналогичный вопрос, но принятый ответ не работает .

Вот что я пробовал -

Мой интерфейс

public interface APIHandler {
    @Headers("Content-Type: application/x-www-form-urlencoded")
    @FormUrlEncoded
    @POST(URL)
    Call<ResponseBody> getdata(@Field("jdata") String jdata);
}

Функция вызова

public void load() {
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("BASE_URL")
        .addConverterFactory(GsonConverterFactory.create())
        .build();

// prepare call in Retrofit 2.0
APIHandler iAPI = retrofit.create(APIHandler.class);

String requestBody = "{\"id\":\"value\",\"id1\":\"value2\"}"
Call<ResponseBody> call = iAPI.getData(requestBody);

call.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Call<ResponseBody> c, Response<ResponseBody> response) {
        if (response.isSuccess()) {
            ResponseBody result = response.body();
            String gs = new Gson().toJson(result);
            Log.d("MainActivity", "response = " + gs + " status: " + statusCode);

        } else {
            Log.w("myApp", "Failed");
        }
    }

    @Override
    public void onFailure(Call<ResponseBody> c, Throwable t) {
    }
});
}

Но получаю response = null и status = 200. Что я делаю неправильно? Ожидаемый ответ - это только строка, а не массив JSON.


person jL4    schedule 08.03.2016    source источник
comment
это {"key1":"value1",...} данные json. Вы можете использовать gson для преобразования pojo в объект json, а затем отправить его на сервер   -  person Raghunandan    schedule 08.03.2016
comment
Да, но мне нужно публиковать jdata={"key1":"value1",...}, а не {"key1":"value1",...}   -  person jL4    schedule 08.03.2016
comment
проверьте метод toString @ developer.android.com/intl/es/ ссылка / org / json /   -  person Raghunandan    schedule 08.03.2016
comment
Аргумент уже является строкой (requestBody).   -  person jL4    schedule 08.03.2016
comment
вы проверяли ответ через почтальона?   -  person Raghunandan    schedule 08.03.2016
comment
Да, я проверил с помощью DHC, результат ожидаемый. Если я удалю заголовок или jdata= из тела, он вернет No Content, поэтому оба требуются.   -  person jL4    schedule 08.03.2016
comment
тогда он должен работать. Я бы еще раз проверил формат запроса. код выглядит хорошо   -  person Raghunandan    schedule 08.03.2016


Ответы (2)


Я оставляю это здесь, чтобы это кому-то помогло.

Приведенный выше код правильный. Как я уже упоминал в последней строке, ожидался ответ в виде простой строки. Но поскольку это не ответ JSON, преобразование, вероятно, не сработало, и ответ был нулевым. Единственное решение, которое я смог найти, - это напрямую преобразовать ответ в строку -

try {
        stresp = response.body().string()
        Log.d("MainActivity", "response = " + stresp + " status: " + statusCode);
    } catch (IOException e) {
                    //Handle exception
}

Может быть, есть лучший способ справиться с этим, но у меня это сработало!

person jL4    schedule 09.03.2016

Вы можете так использовать. Я протестировал это, и он работает нормально

public interface APIHandler {
    @POST(URL)
    Call<ResponseBody> getdata(@Body JsonObject body);
}

Тело запроса:

JsonObject requestBody = new JsonObject();
requestBody.addProperty("id", "value1");
requestBody.addProperty("id1", "value2");

Подготовьте звонок в Retrofit 2.0

APIHandler iAPI = retrofit.create(APIHandler.class);

И функция вызова:

 Call<ResponseBody> call = iAPI.getData(requestBody);
    call.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> c, Response<ResponseBody> response) {
            if (response.isSuccess()) {
                String result = response.body().string();

                Log.d("MainActivity", "response = " + result);

            } else {
                Log.w("myApp", "Failed");
            }
        }

        @Override
        public void onFailure(Call<ResponseBody> c, Throwable t) {
        }
    });
person Virendra Kachhi    schedule 24.05.2018