Retrofit POST带请求体无响应体登录接口实现报错求助
问题分析与解决方法
你遇到的问题核心是请求参数的传递方式不匹配:Postman里你是把JSON放在请求体(Raw)里提交,但Android代码里用了@Query注解,这会把参数拼在URL的查询字符串里,和后端期望的接收方式不一致,所以才会触发onFailure。
下面是具体的修正步骤和代码:
1. 创建请求数据类
首先定义一个和后端JSON结构对应的Kotlin数据类,方便Retrofit把它序列化成JSON:
data class LoginRequest( val userLogin: String, val userPassword: String )
2. 修改LoginService接口
把原来的@Query换成@Body注解,这样Retrofit会把数据类对象转换成JSON放在POST请求体里,和你在Postman里的操作一致:
interface LoginService { @POST("login") fun userLogin(@Body loginRequest: LoginRequest): Call<Void> }
3. 调整Retrofit调用代码
在调用接口时,创建LoginRequest对象并传入:
fun checkLoginData() { val retrofit = Retrofit.Builder() .baseUrl("myurl...") // 替换为你的实际基础URL .addConverterFactory(GsonConverterFactory.create()) .build() val service = retrofit.create(LoginService::class.java) val loginRequest = LoginRequest("Mark", "Pencil") val call = service.userLogin(loginRequest) call.enqueue(object : Callback<Void> { override fun onResponse(call: Call<Void>, response: Response<Void>) { // 用isSuccessful判断更稳妥,涵盖所有2xx成功状态码 if (response.isSuccessful) { Toast.makeText(applicationContext, "Logged in", Toast.LENGTH_SHORT).show() } else { // 非成功状态可以提示具体码,方便排查 Toast.makeText(applicationContext, "Login failed: ${response.code()}", Toast.LENGTH_SHORT).show() } } override fun onFailure(call: Call<Void>, t: Throwable) { // 打印异常信息,帮助定位问题(比如网络问题、序列化错误) t.printStackTrace() Toast.makeText(applicationContext, "Error: ${t.message}", Toast.LENGTH_SHORT).show() } }) }
额外排查点
- 确保你的AndroidManifest.xml里已经添加了网络权限:
<uses-permission android:name="android.permission.INTERNET" /> - 如果还是失败,可以在
onFailure里打印异常栈信息,看看是网络连接问题、Gson序列化问题还是其他错误。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

