Kotlin & Retrofit:无需响应的简易POST请求实现求助
我完全懂你的烦恼——找的Retrofit教程要么代码复杂到没必要,要么照着写还编译不通过,尤其是你只需要拿个状态码的简单场景。下面给你一套干净、可运行的实现方案,一步一步来:
第一步:配置依赖
先在你的build.gradle.kts(或build.gradle)里添加必要的依赖,这些都是Retrofit核心和处理简单请求的轻量库:
dependencies { // Retrofit核心库 implementation("com.squareup.retrofit2:retrofit:2.9.0") // 处理字符串类型的请求/响应体(适合我们只关注状态码的场景) implementation("com.squareup.retrofit2:converter-scalars:2.9.0") // OkHttp(Retrofit默认依赖,如需自定义超时等配置可单独引入) implementation("com.squareup.okhttp3:okhttp:4.10.0") }
第二步:定义API接口
我们只需要一个极简的POST接口,返回Response<ResponseBody>——这个Response对象里直接包含状态码,完全不需要解析响应体内容:
import retrofit2.Response import retrofit2.http.Body import retrofit2.http.POST import retrofit2.http.Url import retrofit2.http.Field import retrofit2.http.FormUrlEncoded interface ApiService { // 支持动态URL的JSON请求,用suspend函数适配Kotlin协程 @POST suspend fun postJsonRequest( @Url url: String, // 可动态传接口路径,也可以固定写在@POST里比如@POST("api/login") @Body requestBody: String // 传入JSON格式的字符串即可 ): Response<ResponseBody> // 如果是表单提交的场景,用这个版本更方便 @FormUrlEncoded @POST("api/login") suspend fun postFormRequest( @Field("username") username: String, @Field("password") password: String ): Response<ResponseBody> }
第三步:创建Retrofit实例
封装一个单例的Retrofit客户端,避免重复创建实例浪费资源:
import retrofit2.Retrofit import retrofit2.converter.scalars.ScalarsConverterFactory object RetrofitClient { // 替换成你的实际基础API域名 private const val BASE_URL = "https://your-api-domain.com/" val apiService: ApiService by lazy { Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(ScalarsConverterFactory.create()) .build() .create(ApiService::class.java) } }
第四步:发起请求并获取状态码
在安全的协程作用域里调用接口(比如Activity的lifecycleScope,会自动跟随生命周期销毁请求,避免内存泄漏):
import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope import kotlinx.coroutines.launch import retrofit2.ResponseBody class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // JSON请求示例 lifecycleScope.launch { try { val jsonBody = """{"username":"test","password":"123456"}""" val response = RetrofitClient.apiService.postJsonRequest( url = "api/login", // 拼接在BASE_URL后的接口路径 requestBody = jsonBody ) // 直接获取状态码 val statusCode = response.code() println("JSON请求状态码:$statusCode") // 根据状态码做逻辑处理 when (statusCode) { 200 -> { /* 请求成功的逻辑 */ } 401 -> { /* 未授权,比如token过期 */ } 404 -> { /* 接口不存在 */ } else -> { /* 其他异常状态处理 */ } } } catch (e: Exception) { // 处理网络异常、超时等情况 e.printStackTrace() } } // 表单请求示例(如果需要的话) lifecycleScope.launch { try { val response = RetrofitClient.apiService.postFormRequest( username = "test", password = "123456" ) val statusCode = response.code() println("表单请求状态码:$statusCode") } catch (e: Exception) { e.printStackTrace() } } } }
几个关键注意点
- 网络权限:别忘了在
AndroidManifest.xml里添加网络权限:<uses-permission android:name="android.permission.INTERNET" /> - 协程选择:不要用
GlobalScope,优先用lifecycleScope(Activity/Fragment)或viewModelScope(ViewModel),避免内存泄漏。 - 状态码快捷判断:
response.isSuccessful()可以快速判断是否是200-299的成功状态,不用手动写范围判断。
这套代码完全聚焦于获取状态码的需求,没有多余的解析逻辑,直接就能编译运行。
内容的提问来源于stack exchange,提问作者netshark1000
相关产品推荐
相关产品推荐

