RAML: вложенные схемы

1) Могу ли я использовать вложенность в определении схемы при написании RAML?

Например:

schemas:
  - DNSResponse: |
      {
        "type": "object",
        "properties": {
            "AnswerSection": {
                "type": "array",
                "items": (((I want a re-useable schema here. ex: ARecord)))
            },
            "AA": {"type": "boolean"},
            "AD": {"type": "boolean"},
            ...
        }
      }
  - ARecord: |
      {
        "type": "object",
        "properties": {
            "address": "string",
            "ttl": "number",
            "name": "string"
        }
      }

2) Могу ли я использовать выбор / перечисление для набора вложенных схем?

"items": [ARecord, MXRecord, PTRRecord, ...]

person KFunk    schedule 21.11.2014    source источник


Ответы (3)


1) Да, можно. См. этот пример. Это было бы:

"items": { "$ref": "ARecord" }

2) Я считаю, что это возможно в черновике 4 схемы JSON, используя oneOf директива. Я не думаю, что это поддерживается RAML. В качестве альтернативы вы можете создать базовую схему и сделать так, чтобы ARecord, MXRecord и PTRRecord расширили эту базовую схему, а затем разрешили элементы базовой схемы. Это не будет очень семантически богатым, но может помочь вам начать.

person David Dossot    schedule 21.11.2014
comment
1) $ ref, похоже, не анализируется API Designer или raml2html, поэтому схема вложенного элемента никогда не отображается. 2) у вас случайно есть ссылка для расширения схемы? Я не вижу никаких примеров в спецификации raml, кроме {"$schema": "http://json-schema.org/draft-03/schema"} - person KFunk; 22.11.2014
comment
1) :( сообщить о проблеме в разные проекты ... 2) github.com/ joelittlejohn / jsonschema2pojo / wiki / Ссылка № extends - person David Dossot; 22.11.2014

Поскольку ваш вопрос не на 100% требует JSON, я добавлю это в ответы ...

С выпуском спецификаций RAML 1.0 вы можете использовать types, что позволяет вам делать именно это (что я считаю немного чище).

Вот справочная ссылка: http://docs.raml.org/specs/1.0/#raml-10-spec-types

RAML 1.0 вводит понятие типов данных, которые обеспечивают краткий и эффективный способ описания данных в вашем API. Данные могут быть в параметре URI (базовый или ресурсный URI), параметре запроса, заголовке запроса или ответа или, конечно, в теле запроса или ответа. Некоторые типы являются встроенными, в то время как пользовательские типы могут быть определены путем расширения (наследования) встроенных типов. В любом месте, где API ожидает данные, может использоваться встроенный тип для описания данных или тип может быть расширен встроенным для описания этих данных. Типы CustomSecurityScheme также могут иметь имя, а затем использоваться как любой встроенный тип.

А для тех, кому нужно меньше текста и больше примеров (взятых из документации RAML):

#%RAML 1.0 
title: API with Types
types:
  User:
    type: object
    properties:
      firstname: string
      lastname:  string
      age:       number
/users/{id}:
  get:
    responses:
      200:
        body:
          application/json:
            type: User
person blo0p3r    schedule 23.12.2015
comment
что, если у вашего пользователя есть вложенный объект, такой как адрес: улица, почтовый индекс, город, страна? как вложить этот объект? - person EddardOmeka; 18.01.2016
comment
@OmekaPhive точно так же. Вы можете вложить types. Свойством User может быть address, тип которого имеет много других атрибутов. Очень много объектно-ориентированного подхода. - person blo0p3r; 18.01.2016

Я думаю, что здесь применим следующий пример. Он демонстрирует определение двух типов Url и File (с использованием RAML 1.0), а затем использование логического ИЛИ, чтобы разрешить любой тип (также известный как схема) в Item в качестве подсхемы. При необходимости вы потенциально можете включить больше типов.

Я также определил несколько встроенных примеров, которые демонстрируют, как это работает, если вы используете raml-parser.

#%RAML 1.0
types:
    Url:
        properties:
            url:
                type: string
                example: http://www.cats.com/kittens.jpg
                description: |
                    The url to ingest.

    File:
        properties:
            filename:
                type: string
                example: kittens.jpg
                description: |
                    Name of the file that will be uploaded.


    Item:
        description: |
            An example of a allowing multiple types using RAML 1.0
        properties:
            ext:
                type: File | Url
        examples:
            file_example:
                content:
                    ext:
                        filename: video.mp4
            url_example:
                content:
                    ext:
                        url: http://heres.a.url.com/asset.jpg
            should_fail:
                content:
                    ext:
                        unexpected: blah
person jfunk    schedule 13.05.2016