Spotify API:将曲目添加到播放列表:解析 JSON 时出错

Posted

技术标签:

【中文标题】Spotify API:将曲目添加到播放列表:解析 JSON 时出错【英文标题】:Spotify API: add tracks to playlist: error parsing JSON 【发布时间】:2017-04-28 14:38:05 【问题描述】:

我正在尝试将歌曲批量添加到播放列表。我终生无法找到 API 文档和我发送的内容之间的区别,但无论如何它都会出错。这是我正在使用的函数以及我如何调用它:

def addToPlaylist(songs, playlistUrl, positions = None):
    data =  'uris': songs 
    if position != None:
        data.update( 'position': position )

    headers = authHeader.copy()
    headers.update('Content-Type': 'application/json')
    print(headers)
    print(json.dumps(data))

    req = requests.post(playlistUrl, headers = headers, data = json.dumps(data))
    if req.status_code != 201:
        print('Error: Request returned status code . Returned: '.format(req.status_code, req.text))

songs = ["spotify:track:1i1fxkWeaMmKEB4T7zqbzK", "spotify:track:2VKqMKKCFhTPczQb10TMKB", "spotify:track:7Gl9cKtVjRN6KHNMfV1gD3"]
url = "https://api.spotify.com/v1/users/username/playlists/2...Q/tracks"
addToPlaylist(songs, url, 0)

两个调试 print() 告诉我以下内容:

'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Bearer BlahblahblA'
"position": 0, "uris": ["spotify:track:1i1fxkWeaMmKEB4T7zqbzK", "spotify:track:2VKqMKKCFhTPczQb10TMKB", "spotify:track:7Gl9cKtVjRN6KHNMfV1gD3"]

错误输出告诉我:

Error: Request returned status code 400. Returned: 
  "error" : 
    "status" : 400,
    "message" : "Error parsing JSON."
  

将 URL 更改为 http://localhost:3001 并用 netcat nc -l -p 3001 监听时,我可以看到以下请求:

POST / HTTP/1.1
Host: 0:3001
Accept: application/json
Connection: keep-alive
User-Agent: python-requests/2.11.1
Accept-Encoding: gzip, deflate
Content-Type: application/json
Authorization: Bearer BlahblahblA
Content-Length: 145

"position": 0, "uris": ["spotify:track:1i1fxkWeaMmKEB4T7zqbzK", "spotify:track:2VKqMKKCFhTPczQb10TMKB", "spotify:track:7Gl9cKtVjRN6KHNMfV1gD3"]

我可能认为正文应该是 URL 编码的,即使这不是 Content-Type 标头提到的内容,但另一个请求(DELETE 从播放列表中删除歌曲)有效,我不使用 url编码。

最后the documentation 提到以下内容:

POST https://api.spotify.com/v1/users/user_id/playlists/playlist_id/tracks

[...]

Content-Type:如果在请求正文中传递 URI,则需要,否则忽略。请求体的内容类型:application/json

[...]

uris: Spotify URI 字符串数组 |可选的。要添加的 Spotify 曲目 URI 的 JSON 数组。例如: "uris": ["spotify:track:4iV5W9uYEdYUVa79Axb7Rh", "spotify:track:1301WleyT98MSxVHPZCA6M"]

我做错了吗?

【问题讨论】:

【参考方案1】:

在写这篇文章时,我注意到position 参数不应该出现在请求正文中。它必须在 URI 参数中。测试一下,它可以工作。

在我的辩护中,Spotify 的错误表明 JSON 数据在语法上不正确,事实并非如此。这完全花费了太多时间。

这行得通:

if position is not None:
    playlistUrl += '?position=' + str(position)

而不是data.update('position': position)

【讨论】:

以上是关于Spotify API:将曲目添加到播放列表:解析 JSON 时出错的主要内容,如果未能解决你的问题,请参考以下文章

无需登录即可将曲目添加到播放列表 - API Spotify

Spotify API:第一次尝试将曲目添加到播放列表时出错,第二次尝试有效

使用 spotify-api-server 添加曲目到 Spotify 播放列表

在 Spotify API Javascript + 添加到服务器中搜索曲目

Spotify + AppleScript:将当前曲目添加到播放列表

如何将曲目添加到 Spotify 中的“已加星标”播放列表?