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

问题描述 投票:0回答:1

请求发送:-

@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
投票

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

  1. 创建POJO(Kotlin中的数据类)类,准备好数据,然后把对象传给函数。你需要像这样修改函数

    @POST("config")
    fun postApi(@Body jsonBody: YourPojoClass): Call<ResponseBody>
                          //------^^^^^^------ notice the data type here.
    
  2. 使用 JsonObjectcom.google.gson 包,而不是使用 JSONObjectorg.json 包。它可以完美地与 @Body 注释。因此,修改方法参数,如下所示。

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

请注意,类名是 JsonObjectJSONObject. 第2种方法很简单,因为你不需要创建一个新的POJO类。


1
投票

不要直接发送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())
}
© www.soinside.com 2019 - 2024. All rights reserved.