REST资源方法的默认MIME类型

时间:2015-10-02 01:54:50

标签: java rest jax-rs

我试图了解RESTful服务中的MIME类型。如果有资源方法(sayHello),如下所示

@Path("/customers")
public class CustomerResource {
    @GET
    public String sayHello(){
        return "Hello World";
    }
}

我没有在上述方法中添加任何@Produces@Consumes注释。我有以下问题。

  1. 上述方法用于发送响应的默认MIME类型是什么?
  2. 或者它是否根据" accept-type"生成响应内容类型?来自传入请求?
  3. 请求是否可以指定它接受的内容类型?如果是这种情况,资源方法上面会产生什么样的响应内容类型?
  4. 提前致谢。

1 个答案:

答案 0 :(得分:1)

通常默认为application/octet-stream,除非客户端设置Accept标头,在这种情况下,这是将要使用的类型。

您需要注意的一件事是,MessageBodyWriter不能处理application/octet-stream和大多数类型。比如说你有

@GET
public SomeModel get() {}

如果客户端没有设置Accept: application/json标头,那么运行时将查找可MessageBodyWriterSomeModel序列化的application/octet-stream,它将失败并且你会得到一个例外,例如“没有为mediatype application / octet-stream找到MessageBodyWriter并输入SomeModel”。

所以放@Produces总是一个好主意。另一个好处是确定端点可以生成什么类型​​。例如,如果您有@Produces("application/json"),并且客户端设置了Accept: application/xml标头,那么它们将获得406 Not Acceptable错误代码,这是应该发生的。

注意第一段,我使用了经常这个词。情况并非总是如此。对于某些实例,运行时将根据返回类型进行假设。例如,如果您返回String,则运行时可能会选择text/plain

但就像我说的那样,总是更好地拥有@Produces@Consumes注释。这些不仅是开发人员的提示,也是运行时决策的提示。