2014-11-21 12 views
5

1) Quando si scrive RAML, è possibile utilizzare l'annidamento nella definizione dello schema?RAML: Schemi nidificati

Ad esempio:

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) Posso utilizzare una delle scelte/enum su una serie di schemi nidificabili?

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

risposta

6

1) Sì, è possibile. Vedi this example. Che sarebbe:

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

2) Credo che questo è possibile in Draft 4 di JSON Schema, usando la direttiva oneOf. Non penso che questo sia supportato da RAML però. In alternativa, è possibile creare uno schema di base e disporre di ARecord, MXRecord e PTRRecord estendere questo schema di base e quindi consentire gli elementi dello schema di base. Questo non sarà molto semanticamente ricco ma potrebbe farti iniziare.

+1

1) $ ref non sembra essere analizzato da API Designer o raml2html, quindi lo schema dell'oggetto nidificato non viene mai mostrato. 2) ti capita di avere un link per l'estensione di uno schema? Non vedo alcun esempio nelle specifiche di raml oltre a '{" $ schema ":" http://json-schema.org/draft-03/schema "}' – KFunk

+1

1): "(segnala il problema a i diversi progetti ... 2) https://github.com/joelittlejohn/jsonschema2pojo/wiki/Reference#extends –

+0

Non funziona utilizzando $ ref – Sam

2

Dal momento che la tua domanda non è al 100% richiede JSON, vorrei aggiungere questo nelle risposte ...

Con il rilascio delle specifiche Raml 1.0, è possibile utilizzare types, che ti permette di fare proprio questo (in quello che considero leggermente più pulito).

Ecco il link di riferimento: http://docs.raml.org/specs/1.0/#raml-10-spec-types

Raml 1.0 introduce la nozione di tipi di dati, che forniscono un modo conciso e potente per descrivere i dati nel vostro API. I dati possono essere in un parametro URI (URI di base o di risorsa), un parametro di query, un'intestazione di richiesta o di risposta o, naturalmente, un corpo di richiesta o di risposta. Alcuni tipi sono incorporati, mentre i tipi personalizzati possono essere definiti estendendo (ereditando da) i tipi predefiniti. In qualsiasi posto in cui l'API si aspetta dati, un tipo incorporato può essere usato per descrivere i dati, o un tipo può essere esteso in linea per descrivere quei dati. I tipi di CustomSecurityScheme possono anche essere nominati e quindi utilizzati come qualsiasi tipo built-in.

E per coloro che vogliono meno testo e altri esempi (tratto da documentazione 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

e se il tuo utente ha un oggetto nidificato come indirizzo: via, codice_zip , città, paese? come si annida quell'oggetto? – EddardOmeka

+1

@OmekaPhive allo stesso modo.È possibile nidificare 'tipi'. Una proprietà' Utente' potrebbe essere 'indirizzo', che è un tipo che ha molti altri attributi. . – blo0p3r

+0

vedo cosa intendi – EddardOmeka

2

penso che il seguente esempio si applica qui. Dimostra la definizione di due tipi Url e File (utilizzando RAML 1.0) e quindi utilizzando l'OR logico per consentire uno dei due tipi (schema aka) in Item come sottoschema. Potresti potenzialmente includere più tipi se necessario.

Ho anche definito alcuni esempi in linea che dimostrano come funziona se si utilizza il 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