使用Retrofit请求返回HTTP 500错误,无法定位空参数来源求解决方案
Retrofit请求返回HTTP 500错误排查方案
已发现的代码潜在问题
- Authorization头格式错误:仓库层代码中拼接Bearer token时缺少空格,标准格式为
Bearer <token>,你当前的写法是"Bearer" + token,会导致服务端鉴权解析失败,大概率触发500错误。修复代码如下:
Result.success(apiServices.skipListing("Bearer $token", body))
- 序列化配置不匹配:你的请求体数据类用的是kotlinx的
@Serializable注解,需要确认Retrofit是否配置了对应的kotlinx-serialization-converter,如果你用的是GsonConverterFactory,该注解不会生效,可能导致参数序列化异常,参数结构不符合后端要求触发500。 - 参数类型不匹配:你传递的
area参数是字符串类型的"20",需要确认后端接口要求该字段是String类型还是Int类型,如果后端要求数字类型,传字符串会导致参数解析失败抛出500。
空值来源排查方法
添加OkHttp的日志拦截器打印完整请求报文,即可直观看到请求的所有参数、头信息是否符合预期:
// 依赖导入(如果没加的话) // implementation "com.squareup.okhttp3:logging-interceptor:4.12.0" val loggingInterceptor = HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY } // 构建OkHttpClient时添加拦截器 val okHttpClient = OkHttpClient.Builder() .addInterceptor(loggingInterceptor) .build() // 构建Retrofit实例时传入该client
通过日志可以直接查看请求体的两个字段是否为空,也能确认请求的完整路径、头信息是否正确。
其他可能触发500的原因
- 服务端自身逻辑错误:可以用Postman工具,填入你要传递的zipcode、area参数,加上正确的Authorization头,模拟发送POST请求到对应接口,如果Postman请求也返回500,说明是服务端本身的问题,直接对接后端人员排查即可。
- 接口路径不匹配:确认
@POST("search-skip")的路径和后端提供的接口路径完全一致,拼写错误、缺少前缀/斜杠都可能触发服务端错误。 - 缺失必填请求头:确认后端是否要求除了Authorization之外的其他必填请求头,比如
Content-Type: application/json,缺失也可能导致参数解析失败。
内容的提问来源于stack exchange,提问作者Faiz E Qamar
相关产品推荐
相关产品推荐

