如何使用Node.js向Yahoo! Fantasy Sports API发起POST请求
问题根因
你收到的报错已经明确说明问题:Yahoo Fantasy Sports的所有POST接口仅支持application/xml格式的请求体,你的请求要么没有设置正确的Content-Type请求头,要么请求体为空/格式为JSON,因此被接口拒绝。
解决方案
1. 基于 yahoo-fantasy 客户端调用
首先你需要对照官方文档构造符合规则的XML格式请求体,再将请求头和XML内容传入api方法的第三个参数即可,参考代码如下:
app.get('/oauth-complete', async (req, res) => { // DELETED CODE THAT SETS REFRESH TOKEN IF NEEDED try { const sport = 'nfl'; const { leagues } = (await yf.user.game_leagues(sport)).games[0]; const { league_key } = leagues[0][0]; // 替换为你自己的操作对应XML结构,以下为添加球员的示例XML const postXml = `<?xml version="1.0" encoding="UTF-8"?> <fantasy_content> <transaction> <type>add</type> <players> <player> <player_key>替换为对应球员的player_key</player_key> <transaction_data> <type>add</type> <destination_team_key>替换为目标球队的team_key</destination_team_key> </transaction_data> </player> </players> </transaction> </fantasy_content>` const options = { headers: { 'Content-Type': 'application/xml' }, body: postXml } const response = await yf.api('POST', `https://fantasysports.yahooapis.com/fantasy/v2/league/${league_key}/transactions`, options); console.log('response :>> ', response); } catch (err) { console.error(err); } });
2. 基于 Axios 直接调用
如果要直接用Axios发请求,除了构造XML请求体和设置Content-Type头之外,还需要手动带上OAuth2的访问令牌,参考代码如下:
const postXml = `// 同上的XML请求体内容` const response = await axios.post( `https://fantasysports.yahooapis.com/fantasy/v2/league/${league_key}/transactions?format=json`, postXml, { headers: { 'Authorization': `Bearer ${你的用户访问令牌}`, 'Content-Type': 'application/xml' } } )
注意事项
Yahoo Fantasy Sports的POST接口对XML格式校验极为严格,节点名称、层级、顺序都必须和官方文档给出的示例完全一致,任意字段错误都会导致请求失败,你可以对照官方PHP示例生成的XML结构调整你的请求内容。
内容的提问来源于stack exchange,提问作者ccali11
相关产品推荐
相关产品推荐

