【问题标题】:Restlet: GET requests using queries that access more than one resourceRestlet:使用访问多个资源的查询获取请求
【发布时间】:2011-06-19 10:35:17
【问题描述】:

在数据库中,假设我有很多人的姓名和出生日期,我想获取 20 岁以上的人的姓名。我可能会使用这样的东西:

http://www.example.com/people?age=over20

在这种情况下,路由器会将此 uri 附加到人员资源类。 是否有任何函数可以解析 uri 并获取所需的请求(在本例中,age>20)?还是我应该编写自己的函数?

另一个问题,在这个例子中,查询(age>20)很简单,所以它可以包含在uri中,如果我有复杂的查询(两个表之间的联合..etc)怎么办?我应该将查询放在 xml 文件中并将其发送到服务器吗?

【问题讨论】:

  • 如果您将查询放在 GET 实体正文中,则相同的 URI 模式现在映射到大量不同的资源。这意味着缓存对查询的响应变得不可能,您无法通过电子邮件发送查询链接,书签查询不起作用等等。通过自己的资源名称(HTTP 中的 URI)公开每个不同的应用程序资源的 REST 原则避免了所有这些问题。

标签: java get restlet


【解决方案1】:

是否有任何函数可以解析 uri 并获取所需的请求(在本例中,age>20)?

是的,有解析查询字符串的函数。在这种特殊情况下,使用 Restlet,您可以通过以下方式获取资源中的值:getRequest().getResourceRef().getQueryAsForm().getFirst("age").getValue() == "over20"

可能还有其他方法(也许它在 Restlet 2.0 中得到了改进),但根据我的经验,Restlet 至少是非常结构化和冗长的。我已经搬到JAX-RS 和Jersey 来制作我的资源,因为它让我只需要几个注释就可以完成很多相同的事情。 (在本例中为@QueryParam("age")。)您可以考虑使用键的上/下部分而不是值,以便您可以更轻松地解析字符串并构建查询。这个想法是尝试处理之间的区别: http://www.example.com/people?age=over20&age=under30

与处理:http://www.example.com/people?ageAtLeast=20&ageAtMost=30

另一个问题,在这个例子中,查询(age>20)很简单,所以它可以包含在uri中,如果我有复杂的查询(两个表之间的联合..etc)怎么办?

我建议在这里寻找有关 Restful URI 设计的讨论。理想情况下,不同的实体将是不同的 uri 路径,并且它们的关系将通过您的 URL 显而易见。例如有一个投票率很高的问题:RESTful URL design for search

我应该把查询放在xml文件中并发送给服务器吗?

从技术上讲,这是一个潜在的选择,但如果可能的话,我会避免它。它非常迟钝,尤其是对于简单的 GET。 (另请注意,虽然technically not forbidden,GET 上的实体主体不是标准的,并且有许多产品无法正确处理它,因此您最终会滥用 POST 或其他方法来完成此操作)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-24
    • 2019-12-16
    • 2011-04-23
    • 1970-01-01
    • 2023-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多