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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 07:45:32