请求发送:-
@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())
}
})
有两种方法可以解决这个问题。
创建POJO(Kotlin中的数据类)类,准备好数据,然后把对象传给函数。你需要像这样修改函数
@POST("config")
fun postApi(@Body jsonBody: YourPojoClass): Call<ResponseBody>
//------^^^^^^------ notice the data type here.
使用 JsonObject
从 com.google.gson
包,而不是使用 JSONObject
从 org.json
包。它可以完美地与 @Body
注释。因此,修改方法参数,如下所示。
@POST("config")
fun postApi(@Body jsonBody: JsonObject): Call<ResponseBody>
//------^^^^^^------ notice the data type here.
请注意,类名是 JsonObject
不 JSONObject
. 第2种方法很简单,因为你不需要创建一个新的POJO类。
不要直接发送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())
}