首页 > 解决方案 > 无法通过改造和协程获得 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

标签: androidretrofitkotlin-coroutines

解决方案


推荐阅读