AWS LAMBDA:HTTP POST请求

时间:2019-08-02 09:17:17

标签: node.js amazon-web-services aws-lambda odata

我正试图从OData RESTful API中发布数据,该API来自所使用的示例服务TripPin。 请求成功,但响应est为空。为了发出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”

功能日志: START RequestId:6f1ec2b4-5195-477f-9fb8-56fd33dee0ce版本:$ LATEST

END RequestId:6f1ec2b4-5195-477f enter code here-9fb8-56fd33dee0ce

REPORT RequestId:6f1ec2b4-5195-477f-9fb8-56fd33dee0ce持续时间:431.87 ms

计费持续时间:500 ms内存大小:128 MB使用的最大内存:73 MB

1 个答案:

答案 0 :(得分: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 这样的库可能会使您的生活在短期内变得更轻松。请参见其自述文件/维基上的HTTP Post示例。