NodeJS 使用fetch时请求不起作用(Axios工作)

imzjd6km  于 2023-10-17  发布在  Node.js
关注(0)|答案(1)|浏览(180)

我有以下方法来删除webhook订阅:

const deleteSubscriptions = async (subscription: number) => {
    const url: string = `${CONFIG.STRAVA_API_BASE_URL}/push_subscriptions/${subscription}`;
    const params = {
        client_id: CONFIG.STRAVA_CLIENT_ID,
        client_secret: CONFIG.STRAVA_CLIENT_SECRET
    };
    try {
        const res = await axios.delete(url, {
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded'
            },
            params: params
        });
    } catch (err: any) {
        console.log(err);
    }
};

这个方法工作得很好,但是如果我尝试用Fetch做同样的事情,我会收到一个错误。提取方法:

const deleteSubscriptions = async (subscription: number) =>{
    const url: string = `${CONFIG.STRAVA_API_BASE_URL}/push_subscriptions/${subscription}`
    const body = JSON.stringify({
        client_id: CONFIG.STRAVA_CLIENT_ID,
        client_secret: CONFIG.STRAVA_CLIENT_SECRET,
    })
    try{
        const res = await fetch(url, {
            method: "DELETE",
            headers:{
                "Content-Type": "application/x-www-form-urlencoded"
            },
            body: body

        })
        let data = await res.json();
    }catch (err: any){
        console.log(err)
    }
}

这是我在使用fetch方法时收到的错误:Console Output

j5fpnvbx

j5fpnvbx1#

您的第一个请求是将您的数据作为URL查询参数发送。您的第二个请求是在请求正文中发送您的数据。
第一个是正确的方法,因为URL本身应该代表您要删除的资源的URL,这显然是您正在使用的主机的工作原理。
我不认为GET应该有身体,就像GET不应该有身体一样。
而且,这两个请求都不应该设置Content-Type头,因为不应该有正文,Content-Type应用于正文。
因此,对于fetch(),您需要将参数放入URL中。虽然axios()可以为你做这件事,但我没有看到fetch()接口中有任何地方可以为你做这件事,所以你可能需要在调用fetch()之前自己用查询参数构造URL。

相关问题