You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:25:19