Android:得到响应“200 ok”但改造失败

Posted

技术标签:

【中文标题】Android:得到响应“200 ok”但改造失败【英文标题】:Android : Getting response "200 ok" but Retrofit fails 【发布时间】:2020-02-09 17:39:46 【问题描述】:

我正在使用 Retrofit2 发布 JSON 数组,但是当我发布它时,我得到“200 Ok”响应,并且调用了改造的 onFailed 方法。它说“预期为 BEGIN_ARRAY,但在第 1 行第 2 列路径 $ 处为 STRING”

我是否成功地将 JSON 发送到 WebService?如果它成功了,那么改造为什么会失败? 我的 JSON 数组是这样的:

["Date":"2019-01-01T00:00:00","Duration":"25","Type":1,"Number":"53201","id":0,"isDataSent":false,"Name":"test isim","phoneNumber":"5554242422"]

我已经用 PostMan 测试了 JSON。没关系。

我的改造请求是这样的:

RetrofitClient.getClient()
            .postCallModel(list)
            .enqueue(object : Callback<List<CallLogModel>>
                override fun onFailure(call: Call<List<CallLogModel>>, t: Throwable) 
                    Log.d(tag,"Retrofit Failed!")
                    Log.d(tag,call.toString())
                    Log.d(tag,t.message)
                

                override fun onResponse(call: Call<List<CallLogModel>>, response: Response<List<CallLogModel>>
                ) 
                    Log.d(tag,"Retrofit Succeeded!")
                    Log.d(tag,response.message())
                
            )

有专家可以帮我解决这个问题吗?

我的模型课:

@Entity(tableName = "supportCallLog")
data class CallLogModel(
@SerializedName("Name")
val userName: String,
@SerializedName("phoneNumber")
val userPhone: String,
@SerializedName("Number")
val customerPhone: String,
@SerializedName("Time")
val callDuration: String,
@SerializedName("Type")
val callType: Int,
@SerializedName("Date")
val callDate: String,
var isDataSent : Boolean
)
@PrimaryKey(autoGenerate = true)
var id : Int = 0
 

我的改造界面:

interface RetrofitService 
@POST("api")
fun postCallModel(@Body callLogModel: List<CallLogModel>) : Call<List<CallLogModel>>
   

【问题讨论】:

将 OkHttp 日志拦截器添加到您的 Retrofit 设置中,然后查看 Web 服务返回的内容。它似乎不是您期望的 JSON。 请发布您的 CallLogModel 课程 @CommonsWare 是的,我已经添加了日志拦截器和返回“200 ok”的 Web 服务,这意味着“成功”。但是改造的 onFailed 方法被调用了。 同时从服务器发布响应数组。实际问题在那里 @Swayangjit 我分享了我的模型课。 【参考方案1】:

您的POST 是正确的,这就是您得到 200 的原因。但问题在于您从服务器的响应中。它期望 array 但得到 object,这会导致此错误。

【讨论】:

您假设 REST 端点正在返回 CallLogModel。你有什么证据证明这一点? 但它显示“预期 BEGIN_ARRAY 但为 STRING”它返回字符串。如果我将其设为 Call 那么它会说“预期 BEGIN_OBJECT 但为 STRING” @CommonsWare,我没有证据。这是一个避免 **Expected BEGIN_ARRAY ** 异常的例子,他可以添加任何他需要的东西。而且他也不在乎返回元素。【参考方案2】:

我在@CommonsWare 的帮助下解决了这个问题。我正在发布 json,但我必须处理来自 Web 服务的响应。 Web 服务返回字符串。所以我改变了我的 postCallModel() 的返回类型

旧的返回类型是这样的:

Call<List<CallLogModel>>

我把它改成了:

Call<Any>

现在我不必担心 Web 服务返回什么类型的响应。

【讨论】:

以上是关于Android:得到响应“200 ok”但改造失败的主要内容,如果未能解决你的问题,请参考以下文章

Chrome etag 总是显示 200 ok 但 curl 得到 304 未修改

Spring RestTemplate 与任何非 200 OK 响应交换 POST HttpClientException

使用改造的用户名和密码的android注释

具有标题和数据的POST请求导致200 ok响应但未添加用户

改造解析JSON响应空值Android

改造 2:responseBodyConverter 转换为空对象