java - Jersey 在选择适当的静态端点时考虑 MIME 类型的优先级顺序(包含在请求的接受 header 中)

标签 java rest jersey jax-rs mime-types

请引用下面的代码片段

@Path("/你好")

public class Hello {

  @GET
  @Produces(MediaType.APPLICATION_XHTML_XML)
  public String sayApplicationXhtmlXml() {
    System.out.println("Application XHTML XML IS ACCEPTED");  
    return "Hello Jersey";
  }


  @GET
  @Produces("*/*")
  public String sayAllMimeTypes() {
    System.out.println("All MIME TYPES IS ACCEPTED");
    return "<?xml version=\"1.0\"?>" + "<hello> Hello " + "</hello>";
  }
}

当我从 Firefox 发送带有 header 的请求时

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,asterisk/asterisk;q=0.8

这是 Firefox 的默认 header 。

输出为

ALL MIME TYPES IS ACCEPTED

我觉得有些不对劲。

根据我的理解,输出应该是

Application XHTML XML IS ACCEPTED 

因为 application/xhtml+xml 出现在 Accept header 中的 "asterisk/asterisk" 之前(根据默认值的规则)两者的 q=1.0,因此首先出现的人应获得更高的优先级)

最佳答案

在请求 header 中,指定 text/htmlapplication/xhtml+xml 具有相同的品质因数(默认为 1)。它们的 q 值都高于 */* 通配符类型。然而对于 Jersey,当两个 MIME 类型具有相同的 q 值时,它将根据它们出现的顺序选择 MIME 类型。因此,在本例中,将选择 text/html,因为您的第二个方法 sayAllMimeTypes() 会生成包括 text/html 在内的任何 MIME 类型。因此调用第二个方法。

关于java - Jersey 在选择适当的静态端点时考虑 MIME 类型的优先级顺序(包含在请求的接受 header 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22998139/

相关文章:

java - 我需要在java中除以非常大的数字而不使用任何外部库(家庭作业)

java - Java中不可重置的 "flags"线程安全吗?

带有授权和 JSON 数据的 C# HttpClient 发布 - 401 未经授权

java - 无法使用 Jersey 客户端解码 JSON 对象数组

java - 从 JAX-RS 1.x 迁移到 2.x( Jersey )- 将 QueryParams 设置为 map ?

java批量生产者消费者

java - 正确的归并排序实现?

rest - 在未登录的情况下尝试注销后返回的 HTTP 状态

rest - 如何使用 VSTS REST API 对新构建进行排队

java - REST API 无法以 JSON 格式工作