2014-11-21 4 views
5

1) При написании RAML я могу использовать вложение в определении моей схемы?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, ...] 

ответ

6

1) Да, вы можете. См. this example. Это было бы:

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

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

+1

1) $ ref, по-видимому, не анализируется API Designer или raml2html, поэтому схема вложенного элемента никогда не отображается. 2) есть ли у вас ссылка на расширение схемы? Я не вижу никаких примеров в спецификации raml, отличных от '{" $ schema ":« http://json-schema.org/draft-03/schema »}' – KFunk

+1

1): «(сообщите об этом разные проекты ... 2) https://github.com/joelittlejohn/jsonschema2pojo/wiki/Reference#extends –

+0

Это не работает с использованием $ ref. – Sam

2

Поскольку ваш вопрос не 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 
+0

Что делать, если ваш пользователь имеет вложенный объект, например адрес: street, zip_code , город, страна? Как вы вставляете этот объект? – EddardOmeka

+1

@OmekaPhive же, вы можете вложить «типы». Свойством «Пользователь» может быть «адрес», который является типом, который имеет много других атрибутов. , – blo0p3r

+0

Я понимаю, что вы имеете в виду – EddardOmeka

2

Я думаю, в следующем примере применяется здесь. Он демонстрирует определение двух типов Url и File (с использованием RAML 1.0), а затем используя логический ИЛИ, чтобы разрешить любой тип (aka schema) в 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 
Смежные вопросы