Как resourceType может наследоваться от нескольких типов?

Цель: создать resourceTypes для конечных точек CRUD без повторения.

(работа с RAML 1.0 в Anypoint Studio и Mulesoft Design Center)

Давайте запустим пару resourceTypes для конечных точек одиночного действия:

resourceTypes:
  getItem:
    get: 
      responses:
            200:
              body:
                application/json
  postItem:
    post:
      responses:
        201:
          body: null
  deleteItem:
    delete:
      responses:
        200:
          body: null 

Все идет нормально.

Теперь я хочу создать resourceType для конечной точки, которая разрешает запросы GET и DELETE. Это действительно:

  getDeleteItem:
    type: getItem
    delete:
      responses:
        200:
          body: null

... но мне пришлось повторить код из deleteItem, который мне не нравится.

Эти подходы не работают:

# the syntax for a union of types, does not work for resourceTypes
  getDeleteItem:
    type: getItem | deleteItem
# no error here, but everything after the first type reference is ignored
  getDeleteItem:
    type: { getItem, deleteItem }

Есть ли способ лучше?

Я нашел уродливый обходной путь ("базовые" resourceTypes, каждый из которых имеет свой тип, установленный в переменную, чтобы их можно было связать вместе), но это, кажется, вызывает противоречивые ошибки и сбои в Mulesoft Design Center.

0 ответов

В конце концов я нашел четкий ответ на этот вопрос: используйте необязательные методы (глаголы).

Вместо исходных трех типов ресурсов создайте один со всеми тремя глаголами. Отметьте каждый глагол как требуется: false или добавьте вопросительный знак к имени глагола.

resourceTypes:
  myResourceType:
    get?: 
      responses:
            200:
              body:
                application/json
    post?:
      responses:
        201:
          body: null
    delete?:
      responses:
        200:
          body: null 

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

В этом примере создается конечная точка myResource, которая принимает запросы GET и POST, но не принимает запросы DELETE.

/myResource:
  type:
    myResourceType
  get:
  post:

GET и POST наследуют все, что мы определили в resourceType. Мы можем переопределить или добавить каждый глагол в конечной точке.

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

Другие вопросы по тегам