为什么使用REST @Produces注释

时间:2014-10-10 01:14:19

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

所以我明白你是在指定类型,但为什么呢?在什么条件下会很重要。例如,如果我有以下方法,并且我注释掉@Produces注释,它仍然返回JSON。

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

API文档说'如果没有指定,那么容器将假定可以生成任何类型。'那么为什么我不希望容器承担这个?

2 个答案:

答案 0 :(得分:6)

我认为这取决于你的JAX-RS实现,但这里有泽西对其@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"质量因素较低。

答案 1 :(得分:0)

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

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