web-dev-qa-db-ja.com

serverless-aws-オプションのフィールドを持つドキュメントモデル定義?

リクエストモデルとレスポンスモデルを定義したいと思います。私はAWSでサーバーレスフレームワークを使用していますが、表示されているものはすべて serverless-aws-documentation の使用を推奨しています

READMEは、この行をcustom.documentation.models.MODELNAMEに含める必要があることを示しています

schema: ${file(models/error.json)}

ただし、ベースラインとして使用するmodels/error.jsonのサンプルファイルはありません。

実際の例では serverless.yml 次のような定義があります。

-
  name: DoSomethingRequest
  contentType: "application/json"
  schema:
    type: array
    items:
      type: string

これは私がやろうとしていることについて十分な詳細を提供しません。


私の目標は、文字列オブジェクトの配列、メッセージ、およびステータスコードに対してスキーマを定義することです。ただし、メッセージとステータスコードはオプションです。これらは他のモデルの一部である可能性もあり、可能であれば、モデルごとに定義を繰り返さないようにします。

私の現在の試みは:

-
  name: ReturnArrayResponse
  contentType: "application/json"
  schema:
    type: array
    itemsArray:
      type: string
    message:
      type: string
    statusCode:
      type: number

これで私が望むことはできると思いますが、messagestatusCodeをオプションにして、他のモデルでこれら2つの項目を繰り返すにはどうすればよいですか?

Serverless.ymlファイルに入れることができるymlソリューション、または参照できるjsonファイルのいずれかに満足しています。

19
Serverless chap

ファイルを含める

与えられた例では、_error.json_には任意の有効なスキーマを含めることができます。したがって、これと同じくらい単純なもので問題ありません。

_{"type":"object","properties":{"message":{"type":"string"}}}_

_$schema_やtitleなどの属性を含めることもできます。

_{
  "$schema" : "http://json-schema.org/draft-04/schema#",
  "title" : "Error Schema",
  "type" : "object",
  "properties" : {
    "message" : { "type" : "string" },
    "statusCode": { "type": "number" },
    "itemsArray": {
        "type": "array",
        "items": {
            "type": "string"
        }
    }
  }
}
_

これは、AWSでモデルがすでに定義されているが、それらをビルドするためのサーバーレスyamlがない場合に特に便利です。 AWSコンソールからスキーマをコピーし、jsonをファイルに貼り付けて、質問に記載されているschema: ${file()}構文を使用するだけです。私が知る限り、AWSコンソールに受け入れさせることができることは何でも機能します。

[〜#〜]ドライ[〜#〜]

サーバーレスファイル内の他のモデル内からモデルを参照する方法はわかりませんが、プラグインの作成者と同じアプローチを使用して、再利用する必要があるものをmodelsの外に置くことができます。どこかで再利用しやすいです。プラグインの作成者はcommonModelSchemaFragmentsを使用します。

したがって、そのようなフラグメントがある場合:

_  commonModelSchemaFragments:
    # defining common fragments means you can reference them with a single line
    StringArrayFragment:
        type: array
        items:
          type: string
    HttpResponse:
      type: object
      properties:
        message:
          type: string
        statusCode:
          type: number     
_

次のようなモデルでこれらのフラグメントを参照できます。

_  - 
    name: HttpStatusResponse
    contentType: "application/json"
    schema:
      type: object
      properties:
          serverResponse: 
            ${self:custom.commonModelSchemaFragments.HttpResponse}
          messageArray: 
            ${self:custom.commonModelSchemaFragments.StringArrayFragment}
_

オプションのマーキング属性

これは、属性をrequiredとしてマークすることで実現できます。 オプションにしたい属性を除いて、すべての属性のリストを提供するだけです。そのためのjsonスキーマは次のようになります。

_{
    "type": "object",
    "required": ["message"],
    "properties": {
        "optionalMessage": {
            "type": "string"
        },
        "message": {
            "type": "string"
        }
    }
}
_

サーバーレスファイルでこのようなyamlを使用してビルドします。

_  -
    name: OptionalResponse
    contentType: "application/json"
    schema:
      type: object
      required: 
      - "message"
      properties:
        message:
          type: string
        optionalMessage:
          type: string
_

リクエストの検証に関する注意

属性requiredまたはoptionalのマーキングは、リクエスト本文の検証がオンになっている場合にのみ重要です。

Request body validation option in AWS console

特別なサーバーレス構文を使用してリクエスト検証をオンにする方法がわかりません。 resourcesセクションでこれを実行できるようですが、私は試していません。 ソース

4
Mike Patrick

推測(フォーマットを保持するための回答として投稿)-スキーマの最上位エンティティは、objectではなくarrayである必要があり、次のようになります。

    schema:
      type: object
      properties:
        items:
          type: array
          items:
            type: string
        message:
          type: string
        statusCode:
          type: number
1
Boris Serebrov