将Curl请求转为Axios调用Spotify API时遇415/401错误求助
解决NestJS中Axios调用Spotify API获取Token的415/401错误
问题根源
- 415错误:你的curl命令发送的是
application/x-www-form-urlencoded格式的表单数据,但Axios默认会把JavaScript对象序列化为JSON发送,Spotify的token接口不支持JSON格式的请求体,因此返回415(Unsupported Media Type)。 - 401错误:虽然curl里把client_id和client_secret放在表单参数里能生效,但Spotify官方推荐用Basic Auth方式认证,表单传密钥的方式在Axios格式错误的情况下会触发权限验证失败。
修复代码
修改你的getLikedSongs方法,按以下方式调整:
import axios from 'axios'; import { URLSearchParams } from 'url'; // Node.js内置模块,无需额外安装 @Get('liked-songs') async getLikedSongs(@Query('code') code: string) { console.log('code : ', code); const CLIENT_ID = '{MY_CLIENT_ID}'; const CLIENT_SECRET = '{MY_CLIENT_SECRET}'; const REDIRECT_URI = '{MY_REDIRECT_URI}'; // 构建表单格式的请求体 const params = new URLSearchParams(); params.append('grant_type', 'authorization_code'); params.append('code', code); params.append('redirect_uri', REDIRECT_URI); params.append('scope', 'user-library-read'); // 生成Basic Auth的认证头 const authHeader = Buffer.from(`${CLIENT_ID}:${CLIENT_SECRET}`).toString('base64'); try { const response = await axios.post('https://accounts.spotify.com/api/token', params, { headers: { 'Authorization': `Basic ${authHeader}` } }); console.log('Access token:', response.data.access_token); const accessToken = response.data.access_token; // 后续可使用accessToken调用获取喜欢歌曲的接口 return { accessToken }; } catch (error) { console.error('Error fetching access token:', error.response?.data || error.message); throw error; // 交由NestJS处理错误并返回给前端 } }
关键修改点
- 使用
URLSearchParams构建请求体,确保数据为表单格式,Axios会自动匹配正确的Content-Type。 - 采用Basic Auth认证:将client_id和client_secret用冒号拼接后做base64编码,放在
Authorization请求头中,这是Spotify API推荐的安全认证方式。 - 改用
async/await替代then/catch,符合NestJS异步处理规范,同时避免变量作用域问题。
额外验证点
- 确认
REDIRECT_URI与Spotify开发者后台配置的完全一致(包括协议、域名、路径,不能有多余斜杠)。 - 确认
code为有效的授权码,且未被使用过(授权码仅能使用一次)。
内容的提问来源于stack exchange,提问作者Alexandre Boucard
相关产品推荐
相关产品推荐

