1

目标:为 CRUD 端点创建 resourceTypes 而无需重复自己。

(在 Anypoint Studio 和 Mulesoft Design Center 中使用 RAML 1.0)

让我们为单个操作端点启动几个资源类型:

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

到目前为止,一切都很好。

现在我想为允许 GET 和 DELETE 请求的端点创建一个 resourceType。这是有效的:

  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 }

有没有更好的办法?

我想出了一个丑陋的解决方法(“基本”资源类型,每个类型都将其类型设置为一个变量,因此它们可以串在一起),但它似乎会导致 Mulesoft 设计中心出现不一致的错误和崩溃。

4

1 回答 1

1

我最终确实找到了一个明确的答案:使用可选方法(动词)。

代替原来的 3 个资源类型,创建一个包含所有 3 个动词的类型。根据需要标记每个动词:错误或在动词名称后附加问号。

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 中定义的所有内容。我们可以自由地覆盖或添加到端点的每个动词。

您还可以创建额外的资源类型,并将其作为根类型,但我在尝试使用继承的资源类型的变量时发现了一些问题,并且可选方法似乎足够灵活,可以满足我的目标。

于 2019-09-26T14:54:55.873 回答