Aws LAMBDA:HTTP POST 请求
Posted
技术标签:
【中文标题】Aws LAMBDA:HTTP POST 请求【英文标题】:Aws LAMBDA : HTTP POST request 【发布时间】:2019-12-10 21:38:26 【问题描述】:我正在尝试通过使用的示例服务(即 TripPin)从 OData RESTful API 发布数据。 请求成功,但响应为空。为了发出 HTTP 发布请求,AWS Lambda 平台中是否需要遵守任何特定的结构?
var querystring = require('querystring');
var http = require('http');
exports.handler = function (event, context)
var post_data = querystring.stringify(
UserName:'lewisblack',
FirstName:'Lewis',
LastName:'Black',
Emails:[
'lewisblack@example.com'
],
AddressInfo:[
Address: '187 Suffolk Ln.',
City:
CountryRegion: 'United States',
Name: 'Boise',
Region: 'ID'
],
Gender: 'Male'
);
// An object of options to indicate where to post to
var post_options =
host: event.url,
port: '80',
path: event.path,
method: 'POST',
headers:
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(post_data)
;
// Set up the request
var post_req = http.request(post_options, function(res)
res.setEncoding('utf8');
res.on('data', function (chunk)
console.log('Response: ' + chunk);
console.log("hello");
context.succeed();
);
res.on('error', function (e)
console.log("Got error: " + e.message);
context.done(null, 'FAILURE');
);
);
// post the data
post_req.write(post_data);
post_req.end();
调用参数示例:
"url": "services.odata.org",
"path": "/v4/TripPinServiceRW/"
回应: 空
请求 ID: "6f1ec2b4-5195-477f-9fb8-56fd33dee0ce"
功能日志: 开始请求 ID:6f1ec2b4-5195-477f-9fb8-56fd33dee0ce 版本:$LATEST
END RequestId:6f1ec2b4-5195-477fenter code here
-9fb8-56fd33dee0ce
报告请求 ID:6f1ec2b4-5195-477f-9fb8-56fd33dee0ce 持续时间:431.87 毫秒
计费持续时间:500 毫秒内存大小:128 MB 使用的最大内存:73 MB
【问题讨论】:
【参考方案1】:TL;DR;我认为您的 AWS Lambda 集成已损坏,但我很难确定。为这次讲座道歉。
我推荐以下:
弄清楚你在活动中得到了什么
您在 event
对象中获得的内容取决于您调用 AWS Lambda 函数的方式。您可以invoke it directly via an API call,或间接通过让另一个 AWS 服务触发它。请注意:
事件文档的结构因事件类型而异,包含有关触发功能的资源或请求的数据
https://docs.aws.amazon.com/lambda/latest/dg/lambda-services.html
找出最简单的方法可能是在处理程序的开头添加一些日志记录:
console.log(JSON.stringify(event));
编写一些测试!
一旦你弄清楚event
对象中的实际内容,为它编写一个测试。这应该会改善您的代码设计和开发周期。
针对local test server 测试上面的代码会得到成功的响应。见下文。
但这并不意味着它可以对抗https://services.odata.org。
该 api 看起来是只读的,但您正在尝试对其进行写入。 您在端口 80 上通过 HTTP 调用它。看起来它希望通过端口 443 上的 HTTPS 调用它。同样,您应该弄清楚应该如何调用该服务并为其编写测试。
示例测试用例
index.spec.js
var index = require("./index");
describe('index', () =>
it('can make requests to localhost', (done) =>
return index.handler(
"url": "localhost",
"path": "/"
,
done: done,
succeed: done
);
);
);
package.json
...
"scripts":
"test": "jest"
,
"devDependencies":
"jest": "^24.8.0"
...
输出:
> npm test
> lambda-post@1.0.0 test /somepath/index.spec.js
> jest
PASS ./index.spec.js
index
✓ can make requests to localhost (20ms)
console.log index.js:44
Response: <html><body><h1>POST!</h1></body></html>
console.log index.js:45
hello
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 0.89s, estimated 1s
Ran all test suites.
使用更简单的 http 库
您正在使用低级节点 http 库。像axios 这样的库可能在短期内让你的生活更轻松。请参阅他们的自述文件/wiki 上的 HTTP Post 示例。
【讨论】:
以上是关于Aws LAMBDA:HTTP POST 请求的主要内容,如果未能解决你的问题,请参考以下文章
无服务器框架 + AWS + Lambda + DynamoDB + GraphQL + Apollo Server = 无法使 POST 请求工作
Python3 AWS Lambda-向需要VPN的域发出发布请求
无服务器框架+ AWS + Lambda + DynamoDB + GraphQL + Apollo Server =无法使POST请求工作