使用 retrofit2 android 将 JSONObject 发送到 post 请求后获取错误响应

Getting error response after sending JSONObject to post request using retrofit2 android

请求已发送:-

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

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

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

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

    @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.
    

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