如何将 Spotify 集成到 Mendix:第2部分
In 本系列的第一部分中,我们介绍了客户端凭据身份验证以及如何使用其搜索 API 搜索 Spotify 的内容库。
在本系列的第二部分中,我们讨论如何使用他们的授权码流来获取授权码,以便用户能够读取和更改他们的个人资料数据,包括在用户的设备上播放音乐。
使用授权码流程进行身份验证
此方法的工作原理是将用户发送到 Spotify,以授予您的应用访问其 Spotify 数据的权限。这是通过向 Spotify 提供一组称为范围的权限来实现的,这些权限定义了您的应用需要哪些访问权限。
如需完整指南,请访问 Spotify 的文档页面.
尽可能简单地总结一下,你需要制作一个特殊的重定向 URL,重定向到 Spotify。在那里,用户可以批准访问他们的帐户,Spotify 会将用户重定向回你的应用程序,在那里你可以使用 深度链接模块.
这是我为此创建的 URL:
https://accounts.spotify.com/authorize?response_type=code&client_id='+$ClientID+'&scope='+$scope+'&redirect_uri=https://localhost:8080/link/spotifyauthentication&state='+$state+'&show_dialog='+toString(@MyFirstModule.ShowDialog
$ClientID = 客户 ID
$State = 任何随机的 4 位整数,用于稍后检索数据
$ShowDialog = true 或 false (如果为 true 则每次重定向时都会显示对话框让用户批准,如果为 false 则会自动批准)
$Scope = URL 编码范围列表,以空格分隔
(‘urlEncode('user-modify-playback-state user-read-playback-state user-read-private user-read-email user-read-currently-playing')
每个 API 请求所需的范围都会显示在该端点的文档中。要了解有关范围的更多信息,请参阅 Spotify 指南 关于这个问题的。
在 nanoflow 中,我使用打开 URL 操作来重定向用户:

批准后,Spotify 会通过特殊的重定向 URL 将用户再次重定向回您的应用。在我的应用中,我设置了一个深层链接,它会将 URL 分解成各个部分,并根据微流的参数从中提取用户的唯一授权代码。

然后,应用会获取该代码,并在同一个微流程中将其交换为个人令牌,以处理深层链接。该个人令牌可用于代表该用户进行 API 调用,例如在连接到 Spotify 的设备上播放音乐和修改播放列表。
Location: https://accounts.spotify.com/api/token
HTTP Method: POST
Header: Content-Type 'application/x-www-form-urlencoded'
Body:
grant_type=authorization_code&code=XXX_Your_Auth_Code_XXX&redirect_uri=XXX_YourAppURL_XXX&client_id=XXX_YourClientID_XXX&client_secret=XXX_YourClientSecret_XXX
Response:
{
"access_token": "XXX_USER_ACCESS_TOKEN_XXX",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "XXX_REFRESH_TOKEN_XXX",
"scope": "user-modify-playback-state user-read-email user-read-private"
}
确保存储令牌以供日后使用。
使用个人令牌播放音乐
一旦你为用户获取了个人令牌,向他们发出请求就非常简单了。要在任何与 Spotify 连接的设备上播放音乐,只需 发出请求 到播放音乐端点。
我们需要提供用户令牌和上下文 URI 来播放(上下文 URI 可以用于一个或多个曲目、一张专辑或一个艺术家)。
您可以使用本系列第一部分中讨论的搜索 API 并将 URI 传递到 Play 请求 API 来获取这些信息,如下所示:
Location: https://api.spotify.com/v1/me/player/play
HTTP Method: PUT
HTTP Header: Authorization 'Bearer '+$PersnalSpotifyToken/Access_token
HTTP Header: Content-Type 'application/json'
Body:
'{
"context_uri": "'+$ArtistAlbum/Uri+'",
//anything below here is optional, only context_uri is required
"offset": {
"position": '+$Tracks/Track_number+'
},
"position_ms": 0
}'
此外,如果您想指定要在哪个设备上播放音乐,您可以在设备 ID 的 URL 中传递一个选项查询字符串。
获取设备列表
获取用户的设备列表是 简单的 GET 请求,如下所示:
Location: https://api.spotify.com/v1/me/player/play
HTTP Method: PUT
HTTP Header: Authorization 'Bearer '+$PersnalSpotifyToken/Access_token
HTTP Header: Content-Type 'application/json'
对于响应,选择应用导入映射并使用以下 JSON 结构:
{
"devices": [
{
"id": "string",
"is_active": false,
"is_private_session": false,
"is_restricted": false,
"name": "Kitchen speaker",
"type": "computer",
"volume_percent": 59,
"supports_volume": false
}
]
}
存储设备列表以便接下来传输播放。
在设备之间传输播放
要传输播放内容,只需向 传输播放 端点并向其提供在前一个请求中获得的设备 ID。
Location: https://api.spotify.com/v1/me/player/play
HTTP Method: PUT
HTTP Header: Authorization 'Bearer '+$PersnalSpotifyToken/Access_token
HTTP Header: Content-Type 'application/json'
Body:
'{
"device_ids": [
"XXX_Your_Device_ID_XXX"
]
}'
最终产品

最后,我制作了一个简单的用户界面,让用户查看当前播放曲目和设备列表的所有数据,以及搜索音乐或曲目。您可以下载代码 来自 Github 这里.
希望您喜欢阅读本系列文章,Spotify 拥有丰富的 API,还有更多端点和功能可供探索。祝您创作愉快!