3

我正在寻找一种为资源形成 URI 的好方法,该资源可以过滤记录中包含的值集合。例如,假设您有一个食谱数据库,并且您想要搜索包含“樱桃”的食谱(显然大多数食谱都包含多种成分)。

如果我只想过滤单个值,我可以执行类似于以下的操作:

/recipe/search/?name=Spaghetti

但是过滤多个值呢?我正在考虑以下内容:

/recipe/search/?ingredients=contains=cherry

对此有什么想法吗?这种过滤器有“标准”吗?

更新:我的想法的一个问题是它在后端处理的方式(在我的情况下是 Rails)。当使用这种特定格式查询服务器时,Rails 会生成一个 Ruby 哈希,它可能会变得像下面这样丑陋:

{"ingredients"=>"contains=cherry",
"action"=>"search",
"controller"=>"recipe"}
4

3 回答 3

3

你的 URI

首先,与其他答案相比,我将从一个REST角度开始,然后找到适当的补充。我不擅长 Ruby,所以请忍受后端没有代码。

  1. Recipies 是您要向
    用户展示的实体/recipies
  2. HTTP 有用于过滤的 QUERYS
    想要按日期对这些收件人进行排序吗?采用/recipies/?sortby=date&sort=asc
  3. 只有樱桃食谱类似:/recipies/?ingredients=cherry

这就是构建基本 URL 的 REST 方式。
对于多场比赛,没有官方方法可以做到这一点,但我会关注 user1758003。这是 url 的直观构造,在后端很容易解析,所以我们有/recipies/?ingredients=cherry,chocolate

不要忘记/recipies/search它是不平静的,因为它反映recipies并且不代表一个独立的实体。但是,它是为您网站的访问者托管搜索表单的好地方。

现在第一个问题中包含一些其他问题,让我一一解决:

我有一个使用这个 api 的网站,搜索表单应该是什么样子?

为您的访问者提供一个/recipie/search页面或快速过滤的可能性/recipies。只需设置<form action="/recipies" type="GET">. 浏览器会将所有参数添加为 Query 字符串之后/recipies

高级功能

一个请求/recipies应该列出所有。如果您添加查询,则必须遵守查询的每个参数。所以/recipies/?ingredients=cheese必须只返回俗气的食谱。对于乘法查询参数值,没有固定的标准,但我希望服务直观。
我读GET /recipies/?ingredients=cherry,chocolateGet me the recipies which have ingredients of cherry and chocolate. 要获取包含樱桃或巧克力的食谱列表,我想编写这样的 URI /recipies/?ingredients=cherry|chocolate,这使得它在视觉上与逗号非常不同,并且在编程上下文中具有预定义的含义 (OR)。

于 2013-03-28T15:49:24.267 回答
2

我不熟悉 ruby​​ 哈希的细节,但我猜哈希是为了在 http 和数据访问级别唯一标识查询而创建的?

无论如何,如果您希望在查询参数中使用 json,则要小心 URL 编码。要记住的另一件事是“搜索”一词可能被认为是重复的。如果您的服务器正在使用 GET 方法访问并且您有条件,那么希望您不会修改后端的任何状态。不是你的问题,只是想我会提到它。

所以...

https://yourserver.com/approot/recipe/search?ingredients=cherry,cheese&type=cake

HTTP 没有将逗号定义为查询字符串分隔符,因此您的框架应该能够解析 2 个查询字符串参数:

成分:“樱桃,奶酪”

您应该能够使用 split 或 ruby​​ 提供的任何等效函数轻松地将其转换为数组。

类型:“蛋糕”(添加了额外的查询词来说明一个观点,因为樱桃芝士蛋糕很棒而且蛋糕不是一种成分)

如果我正确理解你的例子,你最终会得到:

{
"ingredients"=>"cherry,cheese",
"type"=>"cake",
"action"=>"search",
"controller"=>"recipe"
}

这就是你要找的东西吗?

于 2013-03-26T22:51:15.163 回答
1

大多数 REST Web 服务仅使用 JSON 数据。因此使用 JSON 格式,它将仅返回单个字符串值。通过这种 JSON 格式,您也可以发送数组值。

对于数组值意味着您将该数组转换为 JSON 格式,如下所示

来自 php:

$ingredients = array('contains'=>array('fruits'=>'cherry,apple','vitamins'=>'a,d,e,k'));
$ingredients_json = json_encode($ingredients);
echo $ingredients_json;

它将返回 json 格式,如下所示:

 {"contains":{"fruits":"cherry,apple","vitamins":"a,d,e,k"}} 

你可以在 url 中使用这个 JSON 字符串

/recipe/search/?ingredients={"contains":{"fruits":"cherry,apple","vitamins":"a,d,e,k"}}

在服务器端,我们可以选择将此 JSON 格式值解码为数组。

{"ingredients"=>"{\"contains\":{\"fruits\":\"cherry,apple\",\"vitamins\":\"a,d,e,k\"}}",
"action"=>"search",
"controller"=>"recipe"}
于 2013-03-26T05:59:51.023 回答