REST 资源方法的默认 MIME 类型

Default MIME types for REST resource methods

我正在尝试了解 RESTful 中的 MIME 类型 services.If 有一个资源方法 (sayHello),如下所示

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

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

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

提前致谢。

通常它会默认为application/octet-stream除非客户端设置Accept header,在这种情况下,这就是将被使用。

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

@GET
public SomeModel get() {}

如果客户端没有设置 Accept: application/json header,那么运行时将寻找 MessageBodyWriter 可以序列化 SomeModelapplication/octet-stream ],它会失败,你会得到一个异常,显示类似 "No MessageBodyWriter found for mediatype application/octet-stream and type SomeModel" 的内容。

所以放置 @Produces 总是一个好主意。另一个好处是 you 确定端点 可以 产生什么类型。例如,如果您有 @Produces("application/json"),并且客户端设置了 Accept: application/xml header,那么他们将得到一个 406 不可接受的错误代码,这是 应该 发生。

注意第一段,我用了经常这个词。情况并非总是如此。对于某些情况,运行时将根据 return 类型做出假设。例如,如果你 return a String 运行时可能会选择 text/plain.

但是就像我说的,总是 最好有 @Produces@Consumes 注释。这些提示不仅适用于开发人员,也适用于运行时做出决定。