Retrofit结合协程调用POST API无法获取正常返回结果的问题求助
问题根因初步定位
你的日志明确显示接口返回HTTP 500状态码且响应体为空,这属于服务端内部处理请求出错的范畴,和你客户端的协程、Retrofit调用逻辑本身没有直接关联,但你当前的代码存在几个明显错误会掩盖真实问题,可按以下步骤逐一排查修复:
客户端代码问题修复
- 首先修复DataSource中的错误分支逻辑:你当前在请求返回非2xx成功码时,依然强制返回
Result.Success(serverResponse.body()!!),500响应的body本身为空,这里会直接触发空指针异常,且完全掩盖了错误状态。修改后的代码如下:
suspend fun sendDetail(token: String, data: SubPropertyData): Result<AddUpdateDataResponse> { val serverResponse: Response<AddUpdateDataResponse> return try { serverResponse = serverApi.sendDetail(token,data) if(serverResponse.isSuccessful) { val body = serverResponse.body() return if (body != null) { Result.Success(body) } else { Result.Error(IOException("响应体为空,HTTP状态码:${serverResponse.code()}")) } } else { // errorBody的内容只能读取一次,调用string()后流会关闭,不要重复读取 val errorMsg = serverResponse.errorBody()?.string() ?: "无错误响应内容,HTTP状态码:${serverResponse.code()}" Log.e("what-code ", errorMsg) Result.Error(IOException("请求失败:$errorMsg")) } } catch (e: Throwable) { if(e is NoConnectivityException) Result.Error(IOException(AppConstant.INTERNET_ERR_MSG)) else Result.Error(IOException(e.localizedMessage ?: "未知请求错误")) } }
- 检查接口路径大小写是否匹配:你在API注解中写的路径是
api/addOrUpdateSubjectPropertyDetail,但实际请求日志里的路径是api/AddOrUpdateSubjectPropertyDetail,首字母A大写,部分服务端对路径大小写敏感,会导致无法匹配接口触发500或404,确认服务端接口路径的大小写要求后修改注解即可。 - 检查请求参数是否符合服务端要求:你提交的JSON里
countyName字段末尾多了一个空格,检查服务端要求的字段名是否为不带空格的countyName,参数名不匹配会导致服务端反序列化参数失败触发500。
服务端排查方向
修复完客户端问题后如果依然返回500,可按以下方向验证:
- 确认Authorization令牌是否有效,是否已过期或权限不足
- 把日志里打印的完整请求参数、请求头复制到Postman等工具中直接请求接口,如果Postman请求也返回500,直接联系服务端开发排查接口内部错误即可。
内容的提问来源于stack exchange,提问作者Andrain
相关产品推荐
相关产品推荐

