【问题标题】:Custom Media Types Used In Request's Body Content Type When Designing A REST Service?设计 REST 服务时在请求的正文内容类型中使用的自定义媒体类型?
【发布时间】:2012-04-21 23:16:42
【问题描述】:

在创建自己的自定义媒体类型格式(比如application/vnd.myapp+xml)时,客户端在发送正文内容时是否应该在自定义媒体类型中这样做?

例如,您将订单的表示放入 uri。内容应该是 application/vnd.myapp+xml,还是只是 xml,因为客户端不会包含链接等超媒体控件?

如果用户接受(它应该接受),服务器将始终使用自定义媒体类型进行响应,但客户端是否必须在其请求正文中使用它?

【问题讨论】:

  • 换一种说法——当一个客户端同意我们的域应用协议时,可以理解为将使用自定义域特定的超媒体作为通信手段,因此应该在客户端之间来回传递和服务器。

标签: http rest hateoas hypermedia


【解决方案1】:

客户端不必使用服务器在 GET 响应中发回的相同媒体类型向服务器发送数据(例如,通过 PUT 或 POST)。由服务决定它可以接收哪些媒体类型以及它将返回哪些类型。当然,它可以实现为支持同一资源双向的多种媒体类型。

【讨论】:

  • 我认为在休息服务中使用自定义媒体类型 (HATEOAS) 的部分原因是为了代表两者之间的合同。
  • 好吧,自定义媒体类型(与“application/json”之类的通用媒体类型相反)确实定义了表示的语法和语义,这是客户端与服务器。并且服务器可以决定它只使用它产生的相同媒体类型的表示。但它可能会选择更灵活,例如允许浏览器将 web 表单作为“application/x-www-form-urlencoded”发布,但支持自定义媒体类型(例如“application/vnd.mycompany.foo+json”“application/vnd.mycompany.foo+xml”)以 JSON 或 XML 为中心的客户端。
  • 是的。有道理,我认为应该是这样。想听到更多关于这个话题的声音。
  • 顺便说一下,关于您关于 HATEOAS 的观点,给定的客户端可能会通过链接关系引导到它可能想要 PUT/POST 到的资源的 URI,并且这些链接关系可能指示自定义媒体类型使用。但是不同的客户端(浏览器、以 javascript 为中心的客户端或以 XML 为中心的客户端)可能会收到不同的链接关系,它们具有最适合它们的不同媒体类型。而且由于 REST 是无状态的,服务器不知道也不关心客户端的 PUT/POST 是否遵循先前发送的链接关系,因此不知道也不关心提供的媒体类型是否与其一致。
  • 是的,但是如果客户端接受我们的超媒体,我们可能会将 mediaType 属性放在该客户端设置为我们的超媒体的链接中。因此,在这种情况下,客户端将使用 content-type=application/vnd.mycompany+json 进行 PUT/POST
【解决方案2】:

创建您自己的自定义媒体类型格式时(比如 application/vnd.myapp+xml), 客户端在发送 body 时应该 内容,在自定义媒体类型中这样做?

不,以 HTML 为例。 HTML 是不同的媒体类型,尽管数据可以以 text/plain、application/x-www-form-urlencoded 或 multipart/form-data 形式提交。所有这些支持的类型都由 HTML 规范本身定义,并且可以在表单定义中提供。所以这取决于你如何用这个控制因素来协调客户端(即 HTML.FORM 中的 enctype)

例如,有两种 JSON 格式具有写入语义:

集合+JSON:http://amundsen.com/media-types/collection/format/

其中明确定义了数据提交格式,是application/vnd.collection+json

Collection.next+JSON:http://code.ge/media-types/collection-next-json/

支持同上,另外还支持“enctype”属性,服务实现者可以为数据提交指定所需的媒体类型。

如果用户使用自定义媒体类型,服务器将始终响应 接受它(它应该),但客户必须在他们的 请求机构?

请参阅上面的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    相关资源
    最近更新 更多