【问题标题】:Getting error response after sending JSONObject to post request using retrofit2 android使用retrofit2 android发送JSONObject到post请求后得到错误响应
【发布时间】:2020-05-07 13:24:01
【问题描述】:

请求已发送:-

@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())
                }
            })

【问题讨论】:

标签: android mvvm retrofit2


【解决方案1】:

有两种方法可以解决这个问题。

  1. 创建 POJO(Kotlin 中的数据类)类,准备数据,并将对象传递给函数。您需要像这样更改功能

    @POST("config")
    fun postApi(@Body jsonBody: YourPojoClass): Call<ResponseBody>
                          //------^^^^^^------ notice the data type here.
    
  2. 使用来自com.google.gson 包的JsonObject,而不是使用来自org.json 包的JSONObject。它与@Body 注释完美配合。所以,改变方法参数如下。

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

请注意,类名是JsonObject 而不是JSONObject。第二种方法很简单,因为您不必创建新的 POJO 类。

【讨论】:

  • 感谢您的回复。我在请求中发送 JSONObject,它在改造中转换为字符串,而不是我将请求更改为 JsonObject,而不是它的工作正常。我用你的第二个解决方案解决了这个问题。
【解决方案2】:

不要直接发送 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())
}

【讨论】:

  • 谢谢.. 我通过将请求更改为 JsonObject 而不是 JSONObject 来解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 2012-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多