在 Serverless 架构中,一些通用的业务逻辑通常被拆分成若干个小函数以实现微服务化。这些函数可以通过 HTTP 触发器被 API Gateway 触发,然后被执行。在这样的架构中,通常需要调用一些第三方 API 来完成某些任务,本文将探讨如何在 Serverless 架构下调用第三方 API。
调用方法
Serverless 架构中通常使用 Lambda 函数来调用第三方 API,可以在 Lambda 函数中使用各种网络请求库来直接请求 API。这里我们展示一个用 Node.js 编写的 Lambda 函数:
// javascriptcn.com 代码示例 const aws = require('aws-sdk'); const https = require('https'); exports.handler = async (event) => { const apiUrl = 'https://api.example.com/v1/getData'; const options = { method: 'GET', hostname: 'api.example.com', port: null, path: '/v1/getData', headers: { 'Authorization': 'Bearer ' + process.env.ACCESS_TOKEN, 'Content-Type': 'application/json' } }; const request = https.request(options, (response) => { let chunks = []; response.on('data', (chunk) => { chunks.push(chunk); }); response.on('end', () => { let body = Buffer.concat(chunks); console.log(body.toString()); }); }); request.write(""); request.end(); };
上面的代码中,我们使用 https
模块来发送 HTTP 请求,可以设置请求方法、请求头、请求主体等。需要注意的是,我们还需要在请求头中带上我们的 API token。这个 token 通常存储在环境变量中,以免泄露到代码中。
错误处理
在使用第三方 API 时,我们需要对一些错误情况进行处理,包括网络不可达、API 返回错误等。以下是错误处理的方法:
1. 遵循 RESTful API 的 HTTP 状态码
通常,RESTful API 的返回状态码可以反映出请求的结果。我们可以根据请求返回的状态码判断请求是否成功:
// javascriptcn.com 代码示例 const request = https.request(options, (response) => { if (response.statusCode === 200) { let chunks = []; response.on('data', (chunk) => { chunks.push(chunk); }); response.on('end', () => { let body = Buffer.concat(chunks); console.log(body.toString()); }); } else { console.log('Failed with status code ' + response.statusCode); } });
2. 错误返回的 JSON 消息解析
某些 API 返回的错误是以 JSON 消息形式返回的,我们可以将该消息解析后使用:
// javascriptcn.com 代码示例 const request = https.request(options, (response) => { let chunks = []; response.on('data', (chunk) => { chunks.push(chunk); }); response.on('end', () => { let body = Buffer.concat(chunks); if (response.statusCode === 200) { console.log(body.toString()); } else { let error = JSON.parse(body.toString()); console.log('Failed with error:', error); } }); });
3. 处理请求超时
在调用网络 API 时,我们需要考虑到网络延迟。为了避免 Lambda 函数的执行超时,需要在 Lambda 函数中设置超时时间和请求超时时间。同时,我们还可以使用 request.setTimeout()
方法来设置超时时间:
request.setTimeout(10000, () => { console.log('Request timed out'); request.abort(); });
4. 处理重试
在调用网络 API 的过程中,有可能遇到一些错误,无法正常地获取相应的数据。这时,我们需要对调用失败的情况进行重试。常见的重试策略有指数退避、随机间隔等方式。
以下代码演示一个简单的重试方法:
// javascriptcn.com 代码示例 let attempt = 0; const makeRequest = (options, callback) => { const request = https.request(options, (response) => { let chunks = []; response.on('data', (chunk) => { chunks.push(chunk); }); response.on('end', () => { let body = Buffer.concat(chunks); if (response.statusCode === 200) { callback(null, body.toString()); } else { let error = JSON.parse(body.toString()); callback(error); } }); }); request.on('error', (error) => { callback(error); }); request.setTimeout(10000, () => { console.log('Request timed out'); if (attempt < 3) { console.log('Retrying...'); attempt++; makeRequest(options, callback) } else { console.log('Max attempts reached, giving up...'); request.abort(); } }); request.write(''); request.end(); };
总结
在 Serverless 架构中,使用 Lambda 函数调用第三方 API 通常是一个必须的步骤。在调用 API 时,需要注意 API 的访问授权以及错误处理。在处理网络请求时,我们还需要考虑请求超时和错误重试等问题。本文提供了一些基本的方法,但对于业务的实际需要,我们需要根据情况进行灵活应对。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/653de3a27d4982a6eb787bc0