Retrofit2 POST请求定制:Android登录接口实现疑问
Retrofit2 实现需求方案
Retrofit完全支持你的需求,下面提供两种符合要求的实现方式:
方式一:利用注解直接固定参数(推荐表单格式请求)
这种方式无需额外构建RequestBody,直接通过注解配置固定参数和可选参数,代码更简洁。
接口定义
import retrofit2.http.POST import retrofit2.http.FormUrlEncoded import retrofit2.http.Field import retrofit2.http.Query interface AuthService { // 固定URL参数level=1通过@Query配置 @FormUrlEncoded @POST("v1") suspend fun authenticate( @Query("level") level: Int = 1, // 固定值,调用时可省略传参 @Field("user") username: String, // 必填参数 @Field("pass") password: String, // 必填参数 @Field("api_key") apiKey: String = "YOUR_FIXED_API_KEY", // 内置固定值,调用时无需传参 @Field("new_pass", required = false) newPassword: String? // 可选参数,不传则不会加入请求体 ): retrofit2.Response<AuthResponse> // 替换成你的实际响应实体类 }
调用示例
// 创建Retrofit实例后获取Service val authService = retrofit.create(AuthService::class.java) // 仅传必填参数(不修改密码的场景) val response1 = authService.authenticate( username = "test_user", password = "test_pass" ) // 传可选参数(重置密码的场景) val response2 = authService.authenticate( username = "test_user", password = "test_pass", newPassword = "new_test_pass" )
方式二:用RequestBody实现(灵活适配复杂场景)
如果需要更灵活的请求体构建,可以用RequestBody实现,同样能固定api_key并处理可选参数。
接口定义
import retrofit2.http.POST import retrofit2.http.Query import retrofit2.http.Body interface AuthService { @POST("v1") suspend fun authenticate( @Query("level") level: Int = 1, // 固定URL参数 @Body requestBody: okhttp3.RequestBody ): retrofit2.Response<AuthResponse> }
构建RequestBody并调用
方式A:用FormBody.Builder构建表单请求体
// 构建请求体 val formBodyBuilder = okhttp3.FormBody.Builder() .add("user", "test_user") .add("pass", "test_pass") .add("api_key", "YOUR_FIXED_API_KEY") // 固定添加api_key // 可选参数判断后添加 val newPassword: String? = "new_test_pass" // 可为null,代表不传递 newPassword?.let { formBodyBuilder.add("new_pass", it) } val requestBody = formBodyBuilder.build() // 发起请求 val response = authService.authenticate(requestBody = requestBody)
方式B:用实体类转JSON请求体(如果接口接受JSON格式)
// 定义请求实体类 data class AuthRequest( val user: String, val pass: String, val api_key: String = "YOUR_FIXED_API_KEY", // 固定默认值 val new_pass: String? = null // 可选参数 ) // 转成JSON格式的RequestBody val authRequest = AuthRequest( user = "test_user", pass = "test_pass", new_pass = "new_test_pass" // 可选,不传则为null,序列化时会忽略(需配置Gson忽略null字段) ) val requestBody = retrofit2.converter.gson.GsonRequestBodyConverterFactory.create().convert(authRequest) // 发起请求 val response = authService.authenticate(requestBody = requestBody!!)
注意:如果用JSON请求体,需要确保Retrofit配置了Gson转换器,并且Gson实例默认的
serializeNulls = false会让null的可选参数不被序列化到请求体中。
内容的提问来源于stack exchange,提问作者Silviu G
相关产品推荐
相关产品推荐

