【问题标题】:Can a RESTful service return both JSON and XML for the same resource, depending on the request header?RESTful 服务能否根据请求标头返回同一资源的 JSON 和 XML?
【发布时间】:2014-04-17 05:48:24
【问题描述】:

我有一个简单的 RESTful 方法,它当前返回对象的 JSON 表示。

我的问题更多是从架构的角度来看,而不是完全技术性的。

是否应该将 RESTful 服务设计为同时返回 JSON 和 XML?

据我所知,这是一种不好的做法,应该为此定义单独的资源。一种资源应返回 JSON 数据和另一种 XML。

我想对了吗?

【问题讨论】:

  • 你的意思是对相同的内容使用双倍的带宽?
  • 很抱歉给您带来了困惑。但我的问题应该是“RESTful 服务能否同时生成 XML 和 JSON 响应,但只根据客户端的 'Accept' 标头发送一个”?

标签: java xml json rest restful-architecture


【解决方案1】:

没有。您表示资源的方式应该由您的客户期望定义(有一个 http-header 来说明客户接受什么表示)。 这意味着您的服务器应检查当前客户端接受的表示形式并以该表示形式发送响应(或发送表示他不能表示该媒体类型中的资源的响应)

【讨论】:

  • 当您使用两种类型注释相同的方法时,这正是 JAX-RS 实现所做的:@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })。因此,使用相同的资源产生两种格式的响应并没有错,只要知道这不会同时返回带有“XML 和 JSON”结果的响应,它会根据 http 选择一个,另一个,或者两者都不Accept 标头。查看RFC 了解更多信息。
  • 酷。因此,基于我假设在客户端浏览器中定义的“Accept”标头,Restful 服务可以在运行时动态选择响应(Json 或 Xml)并将其发送回客户端。对吗?
【解决方案2】:

同一资源可能会根据请求返回 XML 或 JSON,但不应同时返回两者。您将根据请求知道要返回哪一个,因此无需同时生成两者 - 只需生成您将要返回的那个即可。

您可以选择以下方式来决定返回哪个。按顺序评估,当您确定要返回的格式时停止:

  1. 如果已将扩展名添加到资源(GET /user/1234.jsonGET /user/1234.xml),请将其用作请求的格式。
  2. 如果设置了 Accept 标头,则使用该标头的值作为请求的格式。
  3. 如果有请求正文(如 POST 的情况),并且 Content-Type 标头指定 JSON 或 XML,则使用它。
  4. 如果以上都不适用,请使用默认格式(通常使用 JSON 作为默认格式,除非您的客户通常仍在使用 XML)。

【讨论】:

    猜你喜欢
    • 2019-12-12
    • 1970-01-01
    • 2014-03-27
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多