无服务器架构服务模式路径参数

时间:2018-11-02 23:08:56

标签: web serverless-framework serverless

我正在阅读Serverless上的这篇博客文章,介绍无服务器架构存在的不同模式。

我对services pattern感兴趣,并想尝试一下。

在我的serverless.yml文件中使用此配置。

functions:
  apps:
    handler: handler.apps
    events:
      - http: post apps
        cors: true
      - http: patch users
      - http: get users
        cors: true
      - http: delete users

以下输出来自运行serverless deploy

POST - https://x7lpwa04.execute-api.us-west-2.amazonaws.com/staging/users
PATCH - https://x7lpwa04.execute-api.us-west-2.amazonaws.com/staging/users
GET - https://x7lpwa04.execute-api.us-west-2.amazonaws.com/staging/users
DELETE - https://x7lpwa04.execute-api.us-west-2.amazonaws.com/staging/users

现在如果我想获得一个资源,就可以使用CRUD服务,对于get端点/staging/users/{id},我可能会有类似的东西。使用上述模式,是否要由用户传递像这样的/staging/users?id={id}这样的查询字符串参数而不是像这样的/staging/users/{id}这样的路径参数?是否可以使端点具有路径参数?

似乎无法以这种方式覆盖路径。

2 个答案:

答案 0 :(得分:0)

您已经可以使用路径参数,例如:

{
  "myFunction": {
    "handler": "src/myFunction/index.index",
    "description": "Does awesome things",
    "events": [
      {
        "http": {
          "path": "apiPath/{parameterOne}",
          "method": "GET",
          "integration": "lambda",
          "request": {
            "parameters": {
              "parameterOne": true
            },
            "template": {
              "application/json": "{ \"parameterOne\": \"$input.params(\"parameterOne\")\" }"
            }
          },
          "response": {
            "statusCodes": {
              "200": {
                "pattern": ""
              },
              "400": {
                "pattern": "[\\s\\S]*\\[400\\][\\s\\S]*",
                "template": "$input.path('$.errorMessage')"
              },
              "500": {
                "pattern": "[\\s\\S]*(Process\\s?exited\\s?before\\s?completing\\s?request|\\[500\\])[\\s\\S]*",
                "template": "$input.path('$.errorMessage')"
              }
            },
            "headers": {
              "Cache-Control": "'no-cache, no-store'",
              "Pragma": "'no-cache'",
              "Expires": "'0'",
              "Strict-Transport-Security": "'max-age=31536000; includeSubdomains; preload'"
            }
          },
          "cors": {
            "origin": "*",
            "headers": [
              "Content-Type",
              "Pragma",
              "Cache-Control",
              "X-Amz-Date",
              "Authorization",
              "X-Api-Key",
              "X-Amz-Security-Token",
              "X-Amz-User-Agent"
            ],
            "allowCredentials": false
          }
        }
      }
    ]
  }
}

参数parameterOne将映射到Lambda事件中。

答案 1 :(得分:0)

我可能会解释这种错误,但是至少在aws的情况下,您可以在lambda中添加一些资源。您将负责处理正确的行为,可以通过解析事件(如果存在的话)将填充路径参数来做到这一点。

如博客文章中所述

  

您可以通过解析代码中的事件主体来检查传入的HTTP请求的路径和方法,然后执行正确的操作以作为响应。就像在Lambda代码的开头有一个小型路由器一样。

您可以使用

指定一个更完整的事件
  - http:
      path: users/{id}
      method: delete