如何区分rest方法中的客户端类型?

时间:2011-12-20 11:58:56

标签: html xml rest client

我有一个jax-rs休息服务,我已经编写了一个Android客户端。

其他服务公开CRUD报告的方法。 http get请求返回xml结构中的报告列表。

现在,如果我从浏览器访问该服务,我希望http get请求返回html而不是xml。

我可以重载方法以返回不同客户端的不同结果,还是必须为浏览器客户端实现单独的rest方法?

我还考虑过为浏览器使用相同的xml结构并包含xml样式表,但我无法弄清楚如何将xslt链接放在自动生成的xml中。

3 个答案:

答案 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的兼容性。