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请求工作

AWS Lambda 中的 HTTP 请求

如何将签名的 HTTP 请求从 AWS Lambda 发送到 AppSync GraphQL?

HTTP 请求正文未通过 AWS API Gateway 访问 AWS lambda 函数