我有一个jax-rs休息服务,我已经编写了一个Android客户端。
其他服务公开CRUD报告的方法。 http get请求返回xml结构中的报告列表。
现在,如果我从浏览器访问该服务,我希望http get请求返回html而不是xml。
我可以重载方法以返回不同客户端的不同结果,还是必须为浏览器客户端实现单独的rest方法?
我还考虑过为浏览器使用相同的xml结构并包含xml样式表,但我无法弄清楚如何将xslt链接放在自动生成的xml中。
答案 0 :(得分:1)
答案 1 :(得分:1)
虽然Quentin的答案是正确指向的好指针,但它并不是特定于jax-rs。
jax-rs specification在第3.5节中定义注释@Produces
应用程序类可以声明支持的请求和响应 使用@Consumes和23 @Produces注释的媒体类型 分别。这些注释可以应用于资源方法,a 资源24类,或实体提供者(参见4.2.3节)。使用 这些注释在资源方法上覆盖了任何一个 资源类或方法参数或实体提供程序 返回类型。在没有26个这些注释的情况下,支持 对于任何媒体类型(“ / ”)都是假定的。
使用@Produces声明的mime类型会自动与请求的HTTP Accept Request Header匹配。这意味着要区分客户端请求,您可以使用不同的@Produces声明定义资源方法。
在我的情况下,我需要一个返回xml的方法和一个返回html的方法,所以我在资源/报告中声明了两个方法:
@GET
@Produces({MediaType.TEXT_HTML})
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public String getReportsAsHtml(){...}
和
@GET
@Produces({MediaType.APPLICATION_XML})
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public List<Report> getReportsAsXml() {...}
请参阅Quentin关于拼图最后部分的Accept Header偏好的评论
答案 2 :(得分:0)
只需将其作为XML一直发送并使用样式表。在这种情况下,听起来样式表可能非常原始,所以只需使用CSS。下面是一个使用CSS样式表的XML文档示例,该样式表向后兼容旧版IE。
http://mailmarkup.org/hcl/hcl1_0-documentation.xsd
在样式表中注意复制以抵消不必要的名称空间声明提及。这就是我能够实现与IE的兼容性。