请引用下面的代码片段
@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/html
和 application/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/