我应该如何缓存包含大量项目且每次 API 调用限制相对较小的 REST API 调用?

问题描述 投票:0回答:1

我想将 NASA 的这个 api 用于一个小项目:https://api.nasa.gov/neo/rest/v1/neo/browse?api_key=DEMO_KEY

我的问题是,当我想调用这个 API 时,它只显示 20 个项目,我必须使用不同的页码再次调用它以显示另外 20 个项目。我怎样才能缓存这个结果以便我可以立即使用它?

api caching
1个回答
0
投票

如果文件不存在,则从 NASA API 获取,保存并提供服务 如果有 JSON 文件,它将响应它而不是调用 NASA API。

最大页数为 1768。这是硬编码,但可以工作。

我从响应的

total_pages
值中得到它。

    "page": {
        "size": 20,
        "total_elements": 35374,
        "total_pages": 1769,
        "number": xxxx
    }

此演示代码将用于简单的缓存。

演示

另存为

server.js

const express = require('express');
const axios = require('axios');
const fs = require('fs');
const path = require('path');

const app = express();
const port = 3000;
const apiKey = 'Your API Key';
const maxPages = 1768; // Set the maximum number of pages to prevent over-fetching

app.get('/v1/neo/browse', async (req, res) => {
    const page = parseInt(req.query.page, 10);
    if (isNaN(page)) {
        return res.status(400).send('Valid page query parameter is required');
    }
    
    if (page < 0 || page > maxPages) {
        return res.status(400).send('Page number is out of range');
    }

    const filePath = path.join(__dirname, 'responses', `response_page_${page}.json`);
    if (fs.existsSync(filePath)) {
        res.sendFile(filePath);
    } else {
        // If the file doesn't exist, fetch from NASA API, save it, and serve
        try {
            const response = await axios.get(`http://api.nasa.gov/neo/rest/v1/neo/browse?page=${page}&size=20&api_key=${apiKey}`);
            
            // Save the response to a file
            const dir = './responses';
            if (!fs.existsSync(dir)){
                fs.mkdirSync(dir, { recursive: true });
            }
            fs.writeFileSync(filePath, JSON.stringify(response.data, null, 2));
            
            res.sendFile(filePath);
        } catch (error) {
            console.error('Error fetching from NASA API: ' + error.message);
            res.status(500).send('Error fetching data');
        }
    }
});

app.listen(port, () => {
    console.log(`Server running at http://localhost:${port}/`);
});

安装依赖项

npm install express axios

运行服务器

node server.js

邮递员测试

page
可以从0更改为1768

http://localhost:3000/v1/neo/browse/?page=1000

结果

通话后 由于第一次调用,在

response_page_1000.json
目录下创建了
response
。它调用 NASA API 并保存为 json。

如果再次调用同一页面,它不会调用 NASA,只需打开 1000.json 文件并像缓存一样响应。

© www.soinside.com 2019 - 2024. All rights reserved.