Получение ответа об ошибке после отправки JSONObject для отправки запроса с использованием retrofit2 android - PullRequest
0 голосов
/ 07 мая 2020

Запрос отправлен: -

@POST("config")

fun postApi(@Body jsonBody: JSONObject): Call<ResponseBody>

Я получаю текст ответа, как показано ниже: -

{"Response":{"Error":[{"message":"Error parsing JSON: unexpected token: bracket. (15360)\nUnable to infer Temp-Table or dataset schema from JSON Data. (15374)"}]}}

Обратный звонок Метод: -

call?.enqueue(object : Callback<ResponseBody> {

      override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
                    if (response.body() != null) {
                        Log.e("BASE_URL isSuccess  : ", response.isSuccessful.toString())
                        Log.e("BASE_URL response : ", response.body()!!.string())

                    } else {
                        Log.e("failed", response.isSuccessful.toString())
                    }
                }

                override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
                    Log.e("onFailure", t.printStackTrace().toString())
                }
            })

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Есть два способа решить эту проблему.

  1. Создание класса POJO (класс данных в Kotlin), подготовка данных и передача объекта функции. Вам нужно изменить функцию следующим образом:

    @POST("config")
    fun postApi(@Body jsonBody: YourPojoClass): Call<ResponseBody>
                          //------^^^^^^------ notice the data type here.
    
  2. Используйте JsonObject из пакета com.google.gson вместо использования JSONObject из org.json пакета. Он отлично работает с аннотацией @Body. Итак, измените параметр метода, как показано ниже.

    @POST("config")
    fun postApi(@Body jsonBody: JsonObject): Call<ResponseBody>
                          //------^^^^^^------ notice the data type here.
    

Обратите внимание, что имя класса JsonObject, а не JSONObject. Второй способ прост, поскольку вам не нужно создавать новый класс POJO.

1 голос
/ 07 мая 2020

Не отправляйте JSONObject напрямую, конвертируйте свой JSONObject в RequestBody. Итак, сначала измените прототип postApi:

@POST("config")
fun postApi(@Body jsonBody: RequestBody): Call<ResponseBody>

С сайта вызывающего абонента:

postApi(yourJsonObject.toRequestBody())

Вот метод преобразования объекта json в тело запроса:

fun JSONObject.toRequestBody():RequestBody{
    return RequestBody.create(MediaType.parse("application/json; charset=utf-8"), this.toString())
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...