我试图了解RESTful服务中的MIME类型。如果有资源方法(sayHello),如下所示
@Path("/customers")
public class CustomerResource {
@GET
public String sayHello(){
return "Hello World";
}
}
我没有在上述方法中添加任何@Produces
或@Consumes
注释。我有以下问题。
提前致谢。
答案 0 :(得分:1)
通常默认为application/octet-stream
,,除非客户端设置Accept
标头,在这种情况下,这是将要使用的类型。
您需要注意的一件事是,MessageBodyWriter
不能处理application/octet-stream
和大多数类型。比如说你有
@GET
public SomeModel get() {}
如果客户端没有设置Accept: application/json
标头,那么运行时将查找可MessageBodyWriter
到SomeModel
序列化的application/octet-stream
,它将失败并且你会得到一个例外,例如“没有为mediatype application / octet-stream找到MessageBodyWriter并输入SomeModel”。
所以放@Produces
总是一个好主意。另一个好处是你确定端点可以生成什么类型。例如,如果您有@Produces("application/json")
,并且客户端设置了Accept: application/xml
标头,那么它们将获得406 Not Acceptable错误代码,这是应该发生的。
注意第一段,我使用了经常这个词。情况并非总是如此。对于某些实例,运行时将根据返回类型进行假设。例如,如果您返回String
,则运行时可能会选择text/plain
。
但就像我说的那样,总是更好地拥有@Produces
和@Consumes
注释。这些不仅是开发人员的提示,也是运行时决策的提示。