RAML: использование одного и того же типа данных для GET & POST с разными свойствами - PullRequest
0 голосов
/ 14 февраля 2019

Таким образом, я извлекаю схему JSON из моей спецификации RAML для проверки вывода в методах GET, а также ввода в методе POST.

У каждого объекта этого типа есть свойство "required" ID -по крайней мере, это требуется при перечислении этих сущностей в запросе 'get item' или 'get collection'.Но при проверке полученных почтовых данных для создания такого объекта идентификатор явно не требуется (и в любом случае отбрасывается, если он отправляется).

Какой самый лучший СУХОЙ способ иметь это свойство идентификатора требуется для запросов GET, но нетребуется или, что еще лучше, отсутствует в типе для запросов POST?

TL; DR: начать чтение ниже;)

Пример, облегчающий понимание:

Для запросов GET тип должен быть таким:

properties:
  id:
  something1: 
  something2?: 

Для запросов POST тип должен быть таким:

properties:
  something1: 
  something2?: 

без необходимости определения обоих по отдельности, но такжебез использования наследования необходимо создать два типа для каждого ресурса.

В идеале я бы решил это таким образом, но, похоже, это не сработает:

get:
  description: Retrieve a list of <<resourcePathName|!uppercamelcase>>.
  responses:
    200:
      body:
        application/json:
          type: [ entity_id_object, <<resourcePathName|!singularize|!uppercamelcase>> ][]
          example: <<exampleCollection>>

и entity_id_object istпросто:

entity_id_object:
   properties:
     id:

Я думаю, это потому, что <<resourcePathName|!singularize|!uppercamelcase>> не работает в этой комбинации.

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Я пока не могу придумать, как это сделать без двух типов.Но этот пример по крайней мере заставляет вас передавать только один тип и автоматически добавляет NoId к имени типа для запросов POST.

#%RAML 1.0
title: My API
version: v1
mediaType: application/json

types:
  ResponseNoId:
    properties:
      something1: 
      something2?:
  ResponseId:
    properties:
      id:
      something1: 
      something2?:
  Response:
    ResponseNoId|ResponseId

resourceTypes:
  collection:
    usage: Use this resourceType to represent a collection of items
    description: A collection of <<resourcePathName|!uppercamelcase>>
    get:
      description: |
        Get all <<resourcePathName|!uppercamelcase>>,
        optionally filtered
      is: [ hasResponseCollection: { typeName: <<typeName>> } ]
    post:
      description: |
        Create a new <<resourcePathName|!uppercamelcase|!singularize>>
      is: [ hasRequestItem: { typeName: <<typeName>> } ]
  item:
    usage: Use this resourceType to represent any single item
    description: A single <<typeName>>
    get:
      description: Get a <<typeName>>
      is: [ hasResponseItem: { typeName: <<typeName>> } ]

traits:
  hasRequestItem:
    body:
      application/json:
        type: <<typeName>>
  hasResponseItem:
    responses:
      200:
        body:
          application/json:
            type: <<typeName>>
  hasResponseCollection:
    responses:
      200:
        body:
          application/json:
            type: <<typeName>>[]

/myResource:
  type: { collection: { typeName: Response } }
  get:

  /{id}:
    type: { item: { typeName: Response } }
  post:
    body:
      application/json:
0 голосов
/ 14 февраля 2019

Вы можете пометить поле id как readOnly, чтобы прояснить намерение, хотя это не повлияет на способ проверки данных.

Чтобы повлиять на проверку, вы можете создать тип «Чтение» и тип «Запись», где тип «Чтение» имеет дополнительное обязательное свойство id.

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "definitions": {
    "MyWriteEntity": {
      "type": "object",
      "properties": {
        "something1": { "type": "string"},
        "something2": { "type": "string"}
      },
      "required": "something1"
    },
    "MyReadEntity": {
      "allOf": [
        { "$ref": "#/definitions/MyWriteEntity" },
        {
          "id": { "type": "string", "readOnly": true},
          "required": ["id"]
        }
      ]
    }
  }
}
...