raml 0.8 и использование трейтов для тела сообщения

Я использую RAML 0.8, и я пытаюсь использовать / понять особенности

У меня есть дизайн api, и я вижу, что несколько полей повторяются в теле сообщения для каждого вызова api. и мое прочтение спецификации raml заключается в том, что, поскольку они повторяемы, они должны быть кандидатом на признак

/kmi/for/{product}:
  uriParameters: 
    product: 
      description: |
        The product that want to be informed about
      required: true
      repeat: false
      type: string
      example: beans
  post:
    description: |
      Used to submit a keep me informed request
    body:
      application/x-www-form-urlencoded:
        formParameters:
          title:
            description: ...
            type: string
            required: false
            repeat: false
            example: Mr
          firstname:
            description: ...
            type: string
            required: true
            repeat: false
            example: John
          lastname:
            description: ...
            type: string
            required: true
            repeat: false
            example: Connor
          emailAddress:
            description: ...
            type: string
            required: true
            repeat: false
            example: [email protected]

Теперь я хочу извлечь поля формы, заголовок, имя, фамилию, адрес электронной почты в типаж.

Сначала я попробовал следующее

traits:
  - minimumFormFields:
      title:
        description: ...
        type: string
            ....
      firstname:
        description: ...
        type: string
            ....
      lastname:
        description: ...
        type: string
            ....
      emailAddress:
        description: ...
        type: string
            ....

и добавлен в трейт (лишние поля удалены для простоты)

/kmi/for/{product}:
  post:
    description: |
      ...
    body:
      application/x-www-form-urlencoded:
        formParameters:
          is: [minimumFormFields]

Однако это давало мне ошибки:

RAML 0.8 не позволяет использовать свойство title внутри трейтов.

Я попытался обновить черту, чтобы включить больше из исходного определения, но ничего из того, что я сделал, похоже, не работает.

traits:
  - minimumFormFields:
      application/x-www-form-urlencoded:
        formParameters:
          title:
            description: ...
            type: string
            ....
          firstname:
            description: ...
            type: string
            ....
          lastname:
            description: ...
            type: string
            ....
          emailAddress:
            description: ...
            type: string
            ....

Но это дает мне следующую ошибку

[ошибка] Неизвестный узел: 'application / x-www-form-urlencoded'

Если я затем включу тело в трейт, я получу следующую ошибку

[ошибка] Неизвестный узел: '' [ошибка] Неизвестный признак: 'minimumFormFields'.

Как я могу извлечь поля, которые отправляются как часть тела сообщения в трейт?

Наша компания стандартизировала RAML 0.8, поэтому я не могу перейти на RAML 1.

** * ОБНОВЛЕНИЕ 1 * **

Просматривая комментарии Петру Гардеа, я создал тип ресурса

resourceTypes: 
  minimumFormFields:
    post?:
      body:
        application/x-www-form-urlencoded:
          formParameters:
            title:
              description: ...
              type: string
              required: true
              repeat: false

Но я все еще получаю ошибки

[ошибка] Узел: 'minimumFormFields' должен быть заключен в последовательность [ошибка] Неизвестный узел: 'minimumFormFields'

Изменение на -minimumFormFields:

[ошибка] Узел: '-minimumFormFields' должен быть заключен в последовательность [ошибка] Неизвестный узел: '-minimumFormFields'

Переход на - minimumFormFields:

[ошибка] Неизвестный узел: ''

Я использую mulesoft.com для редактирования своего RAML


person Darren Guy    schedule 27.03.2018    source источник
comment
Вы пытались загрузить образец, который я предоставил в своем ответе, в свой редактор? Если образец, который я предоставил, не работает в вашем редакторе, обратитесь в Mulesoft, чтобы исправить его редактор. В качестве альтернативы вы можете создать другой вопрос, показывающий минимальный пример RAML на основе моего примера, который не работает в вашем редакторе, и я могу сказать вам, что с ним не так.   -  person Petru Gardea    schedule 09.04.2018
comment
Привет, я попробовал ваш пример, и это работает, поэтому я думаю, что ошибка должна быть где-то еще. я попробую снова   -  person Darren Guy    schedule 09.04.2018


Ответы (1)


Я не думаю, что с помощью черт можно добиться желаемого. Вместо этого вам нужно использовать resourceTypes.

Это возможный подход, показывающий, как он может работать. Смысл ресурсов следующий:

  • / kmi / test / 1: Несмотря на то, что это тип minimumFormFields, поскольку он не определяет сообщение, он не будет «наследовать» его от resourceType (обратите внимание на знак? после сообщения, что делает его необязательным);
  • / kmi / test / 2: определено как ссылка в соответствии с вашим исходным сообщением
  • / kmi / test / 3: показывает, что вы даже можете переопределить / добавить "базовый" тип.
  • / kmi / for / {product}: чистая настройка в соответствии с вашими требованиями.

Всегда помогает иметь возможность «визуализировать» «решенный» контракт. Парсер RAML должен сделать это за вас. Скриншоты после RAML не требуют пояснений.

#%RAML 0.8
---
title: Sample
resourceTypes: 
  - minimumFormFields:
      post?:      
        body:
          application/x-www-form-urlencoded:   
            formParameters:
              title:
                description: ...
                type: string
                required: false
                repeat: false
                example: Mr
              firstname:
                description: ...
                type: string
                required: true
                repeat: false
                example: John
              lastname:
                description: ...
                type: string
                required: true
                repeat: false
                example: Connor
              emailAddress:
                description: ...
                type: string
                required: true
                repeat: false
                example: [email protected]            

/kmi/test/1:
  type: minimumFormFields
  uriParameters: 
    product: 
      description: |
        The product that want to be informed about
      required: true
      repeat: false
      type: string
      example: beans
  get:
    description: |
      Doens't show a POST
/kmi/test/2:
  post:
    description: |
      Used to submit a keep me informed request
    body:
      application/x-www-form-urlencoded:
        formParameters:
          title:
            description: ...
            type: string
            required: false
            repeat: false
            example: Mr
          firstname:
            description: ...
            type: string
            required: true
            repeat: false
            example: John
          lastname:
            description: ...
            type: string
            required: true
            repeat: false
            example: Connor
          emailAddress:
            description: ...
            type: string
            required: true
            repeat: false
            example: [email protected]        
/kmi/for/{product}:
  type: minimumFormFields
  uriParameters: 
    product: 
      description: |
        The product that want to be informed about
      required: true
      repeat: false
      type: string
      example: beans
  post:
    description: |
      Used to submit a keep me informed request
/kmi/test/3:
  type: minimumFormFields
  uriParameters: 
    product: 
      description: |
        The product that want to be informed about
      required: true
      repeat: false
      type: string
      example: beans
  post:
    description: |
      Used to submit a keep me informed request      
    body:
      application/x-www-form-urlencoded:
        formParameters:
          anotherThing:
            description: ...
            type: string
            required: false
            repeat: false
            example: Mr
          emailAddress:
            description: This looks better
            type: string
            required: true
            repeat: false
            example: [email protected]

Тест 1: POST удален, отображается только GET.

введите описание изображения здесь

Тест 2: "встроенный" способ.

введите описание изображения здесь

Тест 3: "повторно используемый" способ.

введите описание изображения здесь

Тест 4: "переопределенный" способ.

введите описание изображения здесь

person Petru Gardea    schedule 05.04.2018
comment
Привет, у меня все еще возникают проблемы, и я обновил исходные вопросы. К вашему сведению, я использую anypoint.mulesoft.com в качестве редактора RAML. - person Darren Guy; 09.04.2018