用于暴露资源的类“/ hello”:
@Path("/hello")
public class Test {
//-- produces MIME type text/plain
@GET
@Produces(MediaType.TEXT_PLAIN)
public String thankYouTxt(){
System.out.println("thankYouTxt");
return "thankYouTxt\n";
}
//-- consumes MIME type text/plain
@GET
@Consumes(MediaType.TEXT_PLAIN)
public String thankYouInputTxt(){
System.out.println("thankYouInputTxt");
return "thankYouInputTxt";
}
//-- produces MIME type text/html
@GET
@Produces(MediaType.TEXT_HTML)
public String thankYouHTML(){
System.out.println("thankYouHTML");
return "thankYouTxtHTML";
}
//-- consumes MIME type text/html
@GET
@Consumes(MediaType.TEXT_HTML)
public void thankYouInputHTML(){
System.out.println("thankYouInputHTML");
//return "thankYouInputHTML";
}
//-- produces MIME type text/xml
@GET
@Produces(MediaType.TEXT_XML)
public String thankYouXML(){
System.out.println("thankYouXml");
return "<?xml version=\"1.0\"?> <message>thankYouTxt</message>";
}
//-- consumes MIME type text/xml
@GET
@Consumes(MediaType.TEXT_XML)
public String thankYouInputXML(){
System.out.println("thankYouInputXML");
return "thankYouInputXML";
}
}
在Api docu上说明了MIME接受顺序:
如果资源类能够生成多个MIME媒体 类型,所选择的资源方法将对应最多 客户声明的可接受的媒体类型。进一步来说, HTTP请求的Accept标头声明了最多 可以接受的。例如,如果Accept标头是Accept:text / plain, 将调用doGetAsPlainText方法。或者如果 Accept标头是Accept:text / plain; q = 0.9,text / html,声明 客户端可以接受text / plain和text / html的媒体类型, 但更喜欢后者,那么将调用doGetAsHtml方法。
谁/什么决定使用哪种MIME类型(text / html)而不是另一种(text / html)?
答案 0 :(得分:1)
好的,重新记录文档,因为似乎存在误解:
所选择的资源方法将对应于客户端声明的最可接受的媒体类型
然后:
HTTP请求的Accept标头声明[s]最可接受的
此标题具有以下形式:
Accept: media/type1[;q=pref], media/type2[;q=pref], etc etc
未提及q
时为1.0。
如果您有使用方法生成的请求,例如foo/bar
和tar/feathers
,如果accept标头声明第一个接受1而第二个接受0,则生成{{1 }} 会跑。另一方面,如果第一个接受0.5,但第二个接受0.6,那么......你得到了图片。
如果没有真正偏好的类型会发生什么,文档甚至都没有说。但是客户应该首先决定自己。