WebDAV PROPFIND方法是否应该与REST API中的JSON一起使用?

cro*_*vel 5 rest json web-services

我正在构建一个在任何地方使用JSON的Web服务.

现在我需要一个HTTP方法来检索资源的属性(例如,像read-only,write,ACL这样的属性).看起来只有一种HTTP方法用于此目的:PROPFIND.

但是规范明确指示使用XML.

无论如何,使用带有JSON接口的动词是疯了吗?我也担心这PROPFIND是WebDAV扩展的一部分.

如果这是不行的,那么在面向JSON的Web服务中检索资源属性的推荐动词或推荐方法是什么?

Aur*_*ien 5

在"代表性的状态转移"架构中,这个想法是:

  • 使用一组非常有限的输入/输出动词,其形式属性可以被普遍定义(例如GET,HEAD安全的,PUT并且DELETE幂等的),
  • 用无限数量的资源规避这少数动词.

因此,使用除HTTP中定义的动词之外的其他动词是个坏主意.事实上,每个WebDAV动词都可以使用HTTP谓词(以及相应的标题和资源)来完成.

在RESTful世界中,您有以下几种选择:

  • 为元数据定义一种新的资源,
  • 在同一资源的表示中混合数据和元数据,
  • 将元数据作为HTTP标头进行管理(请注意,HEAD如果需要获取没有数据的元数据,则可以使用动词).


cas*_*lin 5

REST 与协议无关,但它经常通过 HTTP 协议实现。WebDAV 是 HTTP 协议的扩展。因此,理论上您也可以使用WebDAV 方法(这并不意味着您应该这样做)。

来自菲尔丁论文的第六章:

6.3.1.2 可扩展协议元素

[...] HTTP 请求语义由请求方法名称表示。只要可以在客户端、服务器以及它们之间的任何中介之间共享一组可标准化的语义,就允许方法扩展。[...]

保持简单并坚持使用标准 HTTP 方法:它们众所周知,并且受到大量客户端和代理的支持。

请参阅下面的几种方法,您可以使用 HTTP 动词从资源中获取元数据:

使用子资源

您可以metadata为您想要请求某些元数据的资源拥有一个子资源。例如,要获取用户资源的元数据,就很简单:

GET /api/users/johndoe/metadata HTTP/1.1
Host: example.com
Accept: application/json
Run Code Online (Sandbox Code Playgroud)

使用自定义媒体类型

您可以考虑的另一种方法是自定义媒体类型,例如application/vnd.company.metadata+json用于表示资源的元数据。所以,你会得到如下内容:

GET /api/users/johndoe HTTP/1.1
Host: example.com
Accept: application/vnd.company.metadata+json
Run Code Online (Sandbox Code Playgroud)

通过这种方法,同一端点可以支持其他媒体类型,例如application/json和/或application/vnd.company+json返回数据本身:

GET /api/users/johndoe HTTP/1.1
Host: example.com
Accept: application/json
Run Code Online (Sandbox Code Playgroud)
GET /api/users/johndoe HTTP/1.1
Host: example.com
Accept: application/vnd.company+json
Run Code Online (Sandbox Code Playgroud)

如果需要,application/vnd.company.full+json可以使用另一种媒体类型来请求资源的数据和元数据:

GET /api/users/johndoe HTTP/1.1
Host: example.com
Accept: application/vnd.company.full+json`
Run Code Online (Sandbox Code Playgroud)

GitHub API使用类似的方法。