我正在尝试批量添加歌曲到播放列表。我不能为我的生活找到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()s告诉我以下内容:
{'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."
}
}
将网址更改为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
删除播放列表中的歌曲)是有效的,我不知道使用网址编码。
最后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"]}
我做错了吗?
答案 0 :(得分:0)
在撰写这篇文章时,我注意到position
参数不应该包含在请求正文中。它必须在URI参数中。测试它,它的工作原理。
在我的辩护中,Spotify的错误声称JSON是不可解析的,而不是'未知参数'或类似的东西。这花了太多时间。
这有效:
if position != None:
playlistUrl += '?position=' + str(position)
而不是data.update({ 'position': position})
(< =这是错误的)。