使用Fetch发送DELETE请求失败(Axios可正常运行)
解决Fetch实现Strava Webhook订阅删除的错误问题
问题背景
Axios实现的Strava Webhook订阅删除方法可正常运行,但改用Fetch实现时触发错误,错误信息如下:
{"message":"请求错误","errors":[{"resource":"推送订阅","field":"client_id","code":"缺失"},{"resource":"推送订阅","field":"client_secret","code":"缺失"}]}
核心差异分析
Axios版本中,client_id和client_secret是作为URL查询参数发送的(通过params配置);而Fetch版本错误地将这两个参数放在请求体中,同时用JSON.stringify生成的内容与设置的Content-Type: application/x-www-form-urlencoded格式不匹配,且Strava的DELETE订阅API并不支持从请求体读取认证参数。
修正后的Fetch代码
const deleteSubscriptions = async (subscription: number) =>{ const url = new URL(`${CONFIG.STRAVA_API_BASE_URL}/push_subscriptions/${subscription}`); // 向URL添加认证查询参数 url.searchParams.append('client_id', CONFIG.STRAVA_CLIENT_ID); url.searchParams.append('client_secret', CONFIG.STRAVA_CLIENT_SECRET); try{ const res = await fetch(url.toString(), { method: "DELETE", headers:{ "Accept": "application/json" } }); if (!res.ok) { const errorData = await res.json(); console.error('删除订阅失败:', errorData); return; } const data = await res.json(); console.log('订阅删除成功:', data); }catch (err: any){ console.error('请求发生错误:', err); } }
修正说明
- 使用
URL对象构建带查询参数的请求地址,确保参数正确编码并附加到URL末尾,符合Strava API的要求 - 移除了错误的请求体配置,DELETE请求无需携带body,Strava会从URL查询参数中读取认证信息
- 添加了响应状态检查,在非成功状态下单独处理错误信息,避免解析JSON时抛出异常
内容的提问来源于stack exchange,提问作者BonBonn
相关产品推荐
相关产品推荐

