用于过滤嵌套集合的RESTful URI

时间:2013-03-20 14:56:11

标签: api rest

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

如果我只想过滤单个值,我可以做类似以下的事情:

/recipe/search/?name=Spaghetti

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

/recipe/search/?ingredients=contains=cherry

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

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

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

3 个答案:

答案 0 :(得分:2)

我不熟悉ruby哈希的具体细节,但是我猜测是否创建了哈希来在http和数据访问级别唯一地识别查询?

如果您希望在查询参数中使用json,则需要注意URL编码。要记住的另一件事是术语"搜索"可以认为是重复的。如果使用GET方法访问您的服务器并且您有标准,那么希望您不会修改后端的任何状态。不是你的问题,只是想到我提到它。

因此...

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

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

成分:"樱桃,奶酪"

你应该能够使用拆分或ruby提供的等效函数轻松转换为数组。

键入:" cake" (添加额外的查询术语以说明一点,因为樱桃芝士蛋糕很棒,蛋糕不是一种成分)

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

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

这就是你要找的地方吗?

答案 1 :(得分:2)

您的URI

首先,与其他答案相比,我将从REST的角度出发,然后找到适当的补充。我在Ruby中并不强大,所以在后端使用无代码。

  1. Recipies是您想呈现的实体 您的用户可以在/recipies
  2. 找到它们
  3. HTTP有QUERYS进行过滤 想按日期对这些收件人进行排序吗?使用/recipies/?sortby=date&sort=asc
  4. 只有樱桃的收件人也是如此:/recipies/?ingredients=cherry
  5. 这就是构建基本URL的REST方式 对于多场比赛,没有正式的方法,但我会关注用户1758003。这是一个直观的url构造,很容易在后端解析,所以我们有/recipies/?ingredients=cherry,chocolate

    不要忘记/recipies/search不安宁,因为它镜像recipies并且不代表独立实体。但是,它是为您网站的访问者托管搜索表单的好地方。

    现在第一个问题还有其他问题,让我逐一解决:

    我有一个使用此API的网站,搜索表单应该如何?

    /recipie/search上为访问者提供/recipies页面或快速过滤功能。 只需设置<form action="/recipies" type="GET">即可。浏览器将在/recipies之后将所有参数添加为查询字符串。

    高级功能

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

答案 2 :(得分: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"}} 

您可以在网址

中使用此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"}