15

私は要求と応答モデルを定義したいと思います。私はAWSとサーバレスフレームワークを使用して、私が見ているすべてのものは、READMEは、私がcustom.documentation.models.MODELNAMEオプションのフィールドを持つserverless-aws-documentationモデル定義ですか?

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

にこのラインを持っている必要があります。しかし、彼らはmodels/error.jsonのサンプルファイルを持っていないと言うserverless-aws-documentation

を使用することをお勧めしますベースラインとして使用する。

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

これは私が何をしようとしているために十分な詳細を提供していません:

は、実際の例serverless.ymlでは、彼らはこのような定義を持っています。


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

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

が、私はこれは私が欲しいものをやろうとしていると思いますが、どのように私は message持っていると statusCodeは任意で、私の他のモデルでは、これら二つの項目を繰り返すことができます:

私の現在の試みはありますか?

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

答えて

4

与えられた例では、error.jsonには有効なスキーマを含めることができます。だから、これは大丈夫ですような単純なもの:あなたはすでにAWSで定義されたモデルを持っている場合、これは特に便利です

{ 
    "$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" 
     } 
    } 
    } 
} 

、しかし:

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

それは$schematitleなどの属性を含めることも大丈夫ですそれらを構築するサーバーレスのyamlはありません。 AWSコンソールからスキーマをコピーし、jsonをファイルに貼り付けて、質問に記載されているschema: ${file()}という構文を使用するだけです。あなたがAWSコンソールを受け入れてもらうことができれば、私は何でも話すことができます。

DRY

私は、サーバーレスファイル内の他のモデルの中からモデルを参照する方法を知っていませんが、プラグインの作者と同じアプローチを使用することができ、そしてちょうどあなたがする必要があるものを置きます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とマークします。 (任意)にしたい属性を除いて、すべての属性のリストを提供するだけです。あなたはサーバレスファイル内でこのようなYAMLを使用して構築します

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

:そのためのJSONスキーマは次のようになります

- 
    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セクションでこれを行うことができるようですが、試していません。 Source

+0

プラグインhttps://www.npmjs.com/package/serverless-reqvalidator-plugin(私はそれを書いた)を使用してリクエストバリデータを作成して有効にすることができます。これは現時点ではまだ機能がありません – erPe

1

だけの推測(書式を保持するための答えとして、それを掲示) - スキーマ内のトップレベルのエンティティはobject、ないarray、このようなものである必要があります。ファイルを含め

schema: 
     type: object 
     properties: 
     items: 
      type: array 
      items: 
      type: string 
     message: 
      type: string 
     statusCode: 
      type: number 
関連する問題