【问题标题】:Why use REST @Produces annotation为什么使用 REST @Produces 注解
【发布时间】:2014-10-10 01:14:19
【问题描述】:

所以我知道您正在指定类型,但为什么呢?在什么条件下有关系。例如,如果我有以下方法,并且我注释掉了@Produces 注解,它仍然返回 JSON。

@GET
@Path("/json")
//@Produces({MediaType.APPLICATION_JSON})
public String getJson(){
    return toJson(getResults());
}

API 文档说“如果未指定,则容器将假定可以生成任何类型。”那么为什么我不想让容器假设呢?

【问题讨论】:

  • 当我快速编码时,我把注释去掉了,它仍然可以正常工作。结果就是结果

标签: java web-services rest jax-rs restlet


【解决方案1】:

我认为这取决于您的 JAX-RS 实现,但这是 Jersey 对其@Produces 注释的解释:https://jersey.java.net/documentation/latest/jaxrs-resources.html#d0e1809

基本上,由客户端决定服务器应该返回什么内容类型。 如果客户端支持多个内容类型,您有时可以为给定方法指定要返回的内容类型的优先级:

@Produces({"application/xml; qs=0.9", "application/json"})

在上面的示例中,如果客户端同时接受“application/xml”和“application/json”(同等),那么服务器总是发送“application/json”,因为“application/xml”的品质因数较低。

【讨论】:

  • 该链接中的泽西岛解释很好地解释了这一点。例如,客户端可以只指定类级别的路径,然后输入与其正在查找的 MIME 类型对应的任何方法。
【解决方案2】:

如果客户端请求带有 Accept: application/xml; 标头的纯 JSON 资源,那么严格来说,服务器应该返回 406(不可接受)状态代码,而不是 JSON 字符串。

如果您使用@Provides 注释,容器应该为您处理这种情况,这就是您应该使用它的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-21
    • 2010-11-24
    • 2020-05-15
    • 2010-09-10
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多