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

时间:2016-04-28 10:08:35

标签: json web-services rest

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

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

但是the spec明确指示使用XML。

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

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

3 个答案:

答案 0 :(得分:5)

在“代表性的国家转移”架构中,这个想法是:

  • 使用一组非常有限的输入/输出动词,其形式属性可以被普遍定义(例如GETHEAD 安全PUTDELETE 幂等),
  • 以无限数量的资源绕过这少数动词。

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

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

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

答案 1 :(得分:4)

REST与协议无关,但它经常通过HTTP协议实现。 WebDAV是HTTP协议的扩展。所以,理论上你也可以使用WebDAV methods(它并不意味着你应该)。

来自菲尔丁论文的chapter 6

  

6.3.1.2 Extensible Protocol Elements

     

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

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

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

使用子资源

您可以为要请求某些元数据的资源提供metadata子资源。例如,要获取用户资源的元数据,它将非常简单:

GET /api/users/johndoe/metadata HTTP/1.1
Host: example.com
Accept: application/json

使用自定义媒体类型

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

GET /api/users/johndoe HTTP/1.1
Host: example.com
Accept: application/vnd.company.metadata+json

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

GET /api/users/johndoe HTTP/1.1
Host: example.com
Accept: application/json
GET /api/users/johndoe HTTP/1.1
Host: example.com
Accept: application/vnd.company+json

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

GET /api/users/johndoe HTTP/1.1
Host: example.com
Accept: application/vnd.company.full+json`

GitHub API使用了类似的方法。

答案 2 :(得分:1)

当您尝试制作HTTP Web服务时,还有一些方法可以在HTTP标头中使用。 而且还有许多属性属性,其中包含有关请求/响应的信息 喜欢  “状态”,“内容类型”等。

您还可以在Web服务中设置这些属性。 喜欢

“Content-Type”:“application / json”;

此处,当您在任何“请求/响应”中设置此属性时,这意味着您只允许“请求/响应”中的特定MIME类型数据。

我对HTTP请求/响应有基本的了解我希望此信息可以帮助您请检查并确保您提供了内容相关设置以及相应的 MIME类型。< / p>

否则您可以点击此链接www.webdev.org