使用 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())
}
有两种方法可以解决这个问题。
创建POJO(Kotlin中的数据class)class,准备数据,将对象传给函数。您需要像这样更改函数
@POST("config")
fun postApi(@Body jsonBody: YourPojoClass): Call<ResponseBody>
//------^^^^^^------ notice the data type here.
使用 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。
请求已发送:-
@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())
}
有两种方法可以解决这个问题。
创建POJO(Kotlin中的数据class)class,准备数据,将对象传给函数。您需要像这样更改函数
@POST("config") fun postApi(@Body jsonBody: YourPojoClass): Call<ResponseBody> //------^^^^^^------ notice the data type here.
使用
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。