Kotlin应用通过Retrofit向Django Rest Framework提交POST请求无数据
以下是几个直接的排查和解决方向:
添加请求日志拦截器,确认实际发送内容
用OkHttp的日志拦截器查看完整请求详情,确认mobile参数是否真的被发送。代码示例:// 先添加依赖:implementation "com.squareup.okhttp3:logging-interceptor:4.11.0" val loggingInterceptor = HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY } val okHttpClient = OkHttpClient.Builder() .addInterceptor(loggingInterceptor) .build() // 构建Retrofit时使用这个client val retrofit = Retrofit.Builder() .baseUrl("你的服务器基础地址") .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(CoroutineCallAdapterFactory()) .build()查看Logcat里的请求体,确认是否包含
mobile=xxx的内容。检查Retrofit实例配置
确保Retrofit添加了正确的转换器和协程适配器,缺少GsonConverterFactory可能导致请求/响应处理异常,缺少CoroutineCallAdapterFactory会导致suspend函数无法正常执行。验证参数传递是否有效
调用RegisterRequest方法时,确认传入的mobile不是空字符串或null。比如检查用户输入的手机号是否正确获取,避免传空值导致后端无数据。排查请求头冲突
@FormUrlEncoded会自动设置Content-Type: application/x-www-form-urlencoded,不要手动添加其他Content-Type头(比如application/json),否则会导致后端无法解析表单数据。检查后端字段匹配
确认DRF接口接收的字段名是mobile(全小写),和代码里@Field("mobile")的参数名完全一致,大小写不匹配会导致后端无法识别参数。尝试调整请求路径
代码里的@POST("v1/register/")带末尾斜杠,试试去掉斜杠改为@POST("v1/register"),避免后端重定向丢失请求体(虽然Postman正常,但部分情况下重定向会影响POST请求)。
内容的提问来源于stack exchange,提问作者HamidReza Afshari

