【问题标题】:REST WebServices - Is it a good or general practice to accept a JSON but return an XML or vice-versa?REST WebServices - 接受 JSON 但返回 XML 是一种好的做法还是一般做法,反之亦然?
【发布时间】:2017-05-11 06:28:57
【问题描述】:

我发现向 Google 正确提出我的问题有点困难。

我正在构建一个 REST Web 服务,它可以接受和返回 XML 和 JSON 媒体类型。我的客户可以使用Content-Type 标头决定向我的服务发送什么(如果是POST),以及使用Accept 标头作为响应接收什么。

但是,我的问题是,我能否创建一个 Web 服务,使其只能接受 JSON(即客户端必须设置Content-type=application/json),但该服务可以返回 XML仅(客户端必须设置Accept=application/xml)?

虽然这在技术上是可行的,但我想知道这是否是一种好的做法,是否有任何 REST Web 服务的通用实现,其中客户端可以指定特定的 Content-Type 但不同的 Accept 标头。

假设我已经实现了如下所示的服务:

@POST
@Path("/users")
@Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public User createUser(User user) {
     /* Do something */
     return user;
}

在上述情况下,客户端可以将 Post 数据以 JSON 格式发送,但期望以 XML 格式接收响应,反之亦然。

这真的是一个好习惯吗? REST 服务是否应该或不应该强调返回具有与其接受的相同媒体类型的内容?比如,消费application/xml时产生application/xml,消费application/json时产生application/json等等?

【问题讨论】:

  • 这一切都取决于您的要求,因为您正确地提到它在技术上是可行的,现在取决于您的要求,您可以实施它,尽管现在数据传输的事实标准是 JSON。跨度>
  • 如果不了解更多关于您的项目要求和决定其成功的业务驱动因素,我认为没有人可以就此提出建议。这是需求级别的决定,而不是工程级别的决定。

标签: java json xml web-services rest


【解决方案1】:

虽然技术上可行,但这根本不是一个好的做法,尤其是如果客户端通过其Accept 标头明确声明它只接受application/json

您可以在同一路径上创建两种方法,而不是一种方法同时接受 XML 和 JSON,每种方法专用于一种特定的内容类型:

@POST
@Path("/users")
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
public User createUserJson(User user) {
     /* Do something */
     return user;
}

@POST
@Path("/users")
@Consumes({MediaType.APPLICATION_XML})
@Produces({MediaType.APPLICATION_XML})
public User createUserXml(User user) {
     /* Do something */
     return user;
}

另见Accept header spec in RFC2616

【讨论】:

  • 在使用对象框架(axis2、cxf、...)时,它框架会“本身”进行序列化(XML、JSON),所以我认为返回客户端要求的内容没有问题(接受标头)。从技术上讲 - 接受标头只是“预期类型”,服务器可能会返回它返回的内容(在 Content-Type 标头中指定)。因此,根据定义,它仍然是有效的服务,但恕我直言,最好的做法是返回客户要求的内容,如果可以的话,它会使服务更易消费
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
  • 2014-02-11
  • 1970-01-01
  • 2022-01-19
相关资源
最近更新 更多