首页 > 解决方案 > 请求不适用于响应正文中的 URL

问题描述

请求不适用于我从响应正文中获得的 URL。该 URL 在控制台中打印正常,但使用它不起作用

request.post(`https://onesignal.com/api/v1/players/csv_export?app_id=${constants.ONESIGNAL_APPID}`, {
    json: {
        "extra_fields": ["country"]
    }, headers: constants.AUTH_HEADER
}, (error, res, body) => {
    if (error) {
        reject(error)
        return
    }
    
    console.log(body)

    var csvURL = body.csv_file_url
    console.log(csvURL)

    request(csvURL) // <--- Request doesn't work with the csvURL from body
    .pipe(fs.createWriteStream("./ji.csv.gz", { encoding: 'binary'}))

这根本行不通!如果我将完全相同的打印 URL 字符串放入请求 URL 中,它会以某种方式工作,但如果我直接从响应正文中获取它,它就不起作用。

这是正文输出:

{
    csv_file_url: 'https://onesignal.s3.amazonaws.com/csv_exports/theappid.csv.gz'
}

我也尝试使用 axios 而不是 request 但它仍然不起作用

更新:使用 node-fetch 也不起作用

async function getAllCountries() {
    return new Promise((resolve, reject) => {
        fetch(`https://onesignal.com/api/v1/players/csv_export?app_id=${constants.ONESIGNAL_APPID}`, {
        method: 'post',
        body:    JSON.stringify({ extra_fields: ["country"] }),
        headers: { 'Authorization': 'Basic ****', 'Content-Type': 'application/json' },
    })
    .then(res => res.json())
    .then(json => {
        const csvURL = json.csv_file_url
        
        console.log(csvURL)
        
        fetch(csvURL)
        .then(
            res => {
                const dest = fs.createWriteStream("./ji.csv.gz");
                res.body.pipe(dest);
                res.body.on("end", () => {
                    gunzip('ji.csv.gz', 'ji.csv', async () => {
                        
                        const usersCSVJSON = await csv().fromFile("ji.csv");
                        const onlyCountriesArray = usersCSVJSON.map((value) => { return value.country })
                        const singleCountries = new Set(onlyCountriesArray)
                        resolve([...singleCountries])
                    })
                });
                dest.on('error', (error)=> {
                    console("ERRORR")
                })
            })
        })
    })
}
```

标签: javascriptnode.jsrequest

解决方案


首先,你不需要任何特殊的库,比如 Request 或 Axios,来做 AJAX。您所需要的只是(内置)fetch方法(有关更多信息,请参阅https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch)。

注意:在 Node 上,您将需要一个库,例如https://www.npmjs.com/package/node-fetch,因为遗憾的是它没有内置 fetch。但是通过使用这样的库,您可以fetch准确在您的客户端和服务器上都以相同的方式......没有客户端库。)

第二 ...

如果我将完全相同的打印 URL 字符串放入请求 URL 中,它会以某种方式工作,但如果我直接从响应正文中获取它,它就不起作用。

这表明您没有看到响应正文中的某些内容。例如,在 URL 的开头可能有一个换行符,或一些其他特殊/不可见的文本字符。如果是这样,那可以解释你的问题。

要调试,我建议并排记录它们:

console.log(csvURL, '*PRINTED URL*')

看看你是否能观察到任何差异。

你也可以尝试检查.length两个字符串,或者做一个csvUrl.trim()看看是否有帮助。最终,您的结果告诉您这两个字符串相同......因为如果它们是,那么您的结果也将是。


推荐阅读