如何用Retrofit将Spotify API授权请求的JS代码转为Kotlin?
步骤1:添加依赖
在你的build.gradle.kts(或build.gradle)中添加Retrofit相关依赖:
// Retrofit核心库 implementation("com.squareup.retrofit2:retrofit:2.9.0") // Gson转换器,用于解析JSON响应 implementation("com.squareup.retrofit2:converter-gson:2.9.0") // OkHttp(可选,用于自定义请求配置) implementation("com.squareup.okhttp3:okhttp:4.10.0")
步骤2:定义响应数据类
创建数据类映射Spotify返回的令牌响应结构:
import com.google.gson.annotations.SerializedName data class TokenResponse( @SerializedName("access_token") val accessToken: String, @SerializedName("token_type") val tokenType: String, @SerializedName("expires_in") val expiresIn: Int )
步骤3:创建Retrofit API接口
定义用于获取令牌的POST请求接口:
import retrofit2.Response import retrofit2.http.Field import retrofit2.http.FormUrlEncoded import retrofit2.http.Header import retrofit2.http.POST interface SpotifyAuthService { @FormUrlEncoded @POST("api/token") suspend fun getAccessToken( @Header("Authorization") authHeader: String, @Field("grant_type") grantType: String ): Response<TokenResponse> }
步骤4:实现令牌获取逻辑
编写代码处理Base64编码、Retrofit实例创建及API调用:
import android.util.Base64 // Android平台用这个;Java/Kotlin后端用java.util.Base64 import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory // 替换为你的Spotify客户端ID和密钥 private const val CLIENT_ID = "YOUR_CLIENT_ID" private const val CLIENT_SECRET = "YOUR_CLIENT_SECRET" // 生成Basic Auth请求头 private fun buildAuthHeader(): String { val credentials = "$CLIENT_ID:$CLIENT_SECRET" val encodedCredentials = Base64.encodeToString(credentials.toByteArray(), Base64.DEFAULT) .trim() // 移除Base64编码可能带的换行符 return "Basic $encodedCredentials" } // 初始化Retrofit private val retrofit = Retrofit.Builder() .baseUrl("https://accounts.spotify.com/") .addConverterFactory(GsonConverterFactory.create()) .build() private val spotifyAuthService = retrofit.create(SpotifyAuthService::class.java) // 协程中调用获取新令牌 suspend fun fetchNewAccessToken() { val authHeader = buildAuthHeader() val response = spotifyAuthService.getAccessToken(authHeader, "client_credentials") if (response.isSuccessful) { response.body()?.let { tokenResp -> val newToken = tokenResp.accessToken // 这里可以将令牌保存到本地或直接使用 println("获取到新令牌:$newToken") } } else { // 处理请求失败情况 println("令牌获取失败:${response.errorBody()?.string()}") } }
关键说明
- 接口方法添加
suspend修饰符,需在协程作用域(如viewModelScope、自定义协程)中调用fetchNewAccessToken() - Base64编码注意平台差异:后端项目替换为
java.util.Base64.getEncoder().encodeToString(credentials.toByteArray()) - 令牌过期后,直接调用
fetchNewAccessToken()即可获取新的有效令牌
内容的提问来源于stack exchange,提问作者jane
相关产品推荐
相关产品推荐

