编写QBE Restful方法的最佳方法是什么?

时间:2010-11-11 18:10:50

标签: java rest seam resteasy

我正致力于使用RESTeasy和Seam开发一些Web服务。我想要创建的服务之一是Query by Example服务。

我首先尝试像这样编码:

@GET
@Produces("application/xml")
@Consumes("application/xml")
@Path("/matching")
public MessageList getMatchingMessages(Message msg);

不幸的是,这导致了客户的并发症:

[testng] [Parser] Running:
[testng]   C:\Users\bdw\workspace-shepherd\GPRI\test-build\testng-Test.xml
[testng] java.lang.RuntimeException: java.lang.ClassCastException: org.apache.commons.httpclient.methods.GetMethod cannot be cast to org.apache.commons.httpclient.methods.EntityEnclosingMethod
[testng]    at org.jboss.resteasy.client.core.ClientInvoker.invoke(ClientInvoker.java:104)
[testng]    at org.jboss.resteasy.client.core.ClientProxy.invoke(ClientProxy.java:59)
[testng]    at $Proxy138.getMatchingMessages(Unknown Source)

等等。此方法的一种变体允许日期范围,但显然不会以这种形式工作:

@GET
@Produces("application/xml")
@Consumes("application/xml")
@Path("/matching")
public MessageList getMatchingMessages(@QueryParam("startDate") Date start,
        @QueryParam("endDate") Date end, Message msg);

当我开始思考它时,将消息传递给GET方法可能会违反REST的精神。当然,从方法中删除Consumes注释允许客户端在没有这些错误的情况下运行。但它引出了一个问题,编写查询方法的正确方法,该方法采用非基于URL的XML输入并生成XML输出?或者它采用基于XML和url的参数并生成XML输出?

2 个答案:

答案 0 :(得分:2)

我对你的问题的编码方面无能为力,但如果你传入的是非URL输入,那么POST方法比GET更合适。您实际上是在创建一个新资源:与该示例匹配的消息列表。

答案 1 :(得分:2)

您认为您可能想要缓存结果吗?如果答案是否定的,那么您可以简单地使用POST。

POST /QueryEngine
Content-Type: application/xml

=>
200 OK
Content-Type: application/xml

如果答案可能是您想要缓存结果,那么您可以这样做:

POST /QueryGenerator
Content-Type: application/xml

=>
303 See Other
Location: /GeneratedQuery/2323

GET /GeneratedQuery/2323

说完所有这些之后,你确定你不能只使用查询参数而不是传递XML吗?