Параметры пути к шаблону служб безсерверной архитектуры - PullRequest
0 голосов
/ 03 ноября 2018

Я читал этот пост в блоге Без сервера о различных шаблонах, существующих для архитектуры без сервера.

Я заинтересован в 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 голосов
/ 12 ноября 2018

Возможно, я неверно истолковал это, но, по крайней мере, в случае с aws вы можете добавить несколько ресурсов в лямбду. Вы будете нести ответственность за правильное поведение, которое вы можете сделать, проанализировав событие, которое заполнит параметры пути, если они существуют.

как упомянуто в сообщении в блоге

Вы можете проверить путь и метод входящего HTTP-запроса, проанализировав тело события в своем коде, а затем выполнить правильную операцию в ответ. Это как маленький маршрутизатор в начале вашего лямбда-кода.

Вы можете указать более полное событие с помощью

  - http:
      path: users/{id}
      method: delete
0 голосов
/ 03 ноября 2018

Вы уже можете использовать параметры пути, например ::10000

{
  "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 будет сопоставлен с лямбда-событием.

...