android - 无法通过改造和协程获得 API 响应
问题描述
我正在尝试使用协程通过 Retrofit 调用 post API,但经过数小时的搜索,我找不到错误。没有关于错误的明确信息。
下面是发布数据后我应该得到的简单 JSON。
{
"status": "OK",
"data": 5,
"message": null,
"code": "200"
}
来自片段的 api 调用
lifecycleScope.launchWhenStarted {
sharedPreferences.getString(AppConstant.token, "")?.let { authToken ->
viewModelSubProperty.sendDetail(authToken,propertyData)
}
}
其中 propertyData 是我发送到 api 的值。
视图模型
suspend fun sendDetail(token: String,data: SubPropertyData) {
viewModelScope.launch(Dispatchers.IO) {
val responseResult = repository.sendDetail(token = token,data)
withContext(Dispatchers.Main) {
if(responseResult is Result.Success) {
Log.e("Viewmodel", "${responseResult.data}")
Log.e("Viewmodel", "$responseResult")
}
else if (responseResult is Result.Error && responseResult.exception.message == AppConstant.INTERNET_ERR_MSG)
EventBus.getDefault().post(WebServiceErrorEvent(null, true))
else if (responseResult is Result.Error)
EventBus.getDefault().post(WebServiceErrorEvent(responseResult))
}
}
}
数据源
suspend fun sendDetail(token: String, data: SubPropertyData): Result<AddUpdateDataResponse> {
val serverResponse: Response<AddUpdateDataResponse>
return try {
serverResponse = serverApi.sendDetail(token,data)
if(serverResponse.isSuccessful)
Result.Success(serverResponse.body()!!)
else {
Log.e("what-code ", ""+serverResponse.errorBody())
Log.e("what-code ", serverResponse.errorBody()?.charStream().toString())
Result.Success(serverResponse.body()!!)
}
} catch (e: Throwable) {
if(e is NoConnectivityException)
Result.Error(IOException(AppConstant.INTERNET_ERR_MSG))
else
Result.Error(IOException(e.localizedMessage))
}
}
API 调用
@POST("api/addOrUpdateSubjectPropertyDetail")
suspend fun sendDetail(
@Header("Authorization") Authorization:String,
@Body data: SubPropertyData
) : Response<AddUpdateDataResponse>
Pojo类
data class AddUpdateDataResponse(
@SerializedName("code")
val code: String?,
@SerializedName("data")
val data: Int?,
@SerializedName("message")
val message: String? = null,
@SerializedName("status")
val status: String?
)
日志
I/okhttp.OkHttpClient: --> POST https://abc/api/AddOrUpdateSubjectPropertyDetail
Content-Type: application/json; charset=UTF-8
Content-Length: 398
Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOiI0IiwiaHR0cDovL3NjaGVtYXnzK5gv0k4
I/okhttp.OkHttpClient: {"address":{"city":"Karachi","countryId":1,"countryName":"Pak","countyId":1,"countyName ":"SSS","stateId":11,"stateName":"Sindh","street":"akl","unit":"00","zipCode":"123"},"appraisedPropertyValue":100000.0,"floodInsurance":0.0,"homeOwnerInsurance":200.0,"isMixedUseProperty":true,"loanApplicationId":5,"mixedUsePropertyExplanation":"ashh","occupancyTypeId":1,"propertyTax":100.0,"propertyTypeId":1}
--> END POST (398-byte body)
--> END POST (398-byte body)
I/okhttp.OkHttpClient: <-- 500
https://abc/api/AddOrUpdateSubjectPropertyDetail (167ms)
I/okhttp.OkHttpClient: server: Microsoft-IIS/10.0
I/okhttp.OkHttpClient: x-powered-by: ASP.NET
date: Mon, 08 Nov 2021 22:31:31 GMT
I/okhttp.OkHttpClient: <-- END HTTP (0-byte body)
E/what-code: null
null
okhttp3.ResponseBody$BomAwareReader@3554188
解决方案
推荐阅读
- spring-mvc - 需要从 REST API 回发解析二进制 pdf 数据并将其保存在文件系统或 mysql db 中
- laravel - Laravel Vue js:如何像这样更新组件表单 Javascript:
- java - 如何创建简单的 maven java web 项目
- c# - 乒乓球物理
- react-native - 急速模块地图中不存在模块“反应”
- properties - 使用 std::vector<> 作为 Objective-C 属性
- java - 使用 ReadObject 和 WriteObject 的自定义序列化
- jmeter - 如何在Jmeter中处理json请求帖子正文中的动态值
- excel - 将用户表单数据自动传输到下一个空白行
- python-3.x - 无法使用带有标记为索引的字符串的 loc 进行设置