我正在寻找一种形式的资源URI的好方法,该资源可以过滤记录中包含的值集合。例如,假设您有食谱数据库,并且您想要搜索包含“樱桃”的食谱(显然大多数食谱会包含多种成分)。
如果我只想过滤单个值,我可以做类似以下的事情:
/recipe/search/?name=Spaghetti
但是对多个值进行过滤呢?我正在考虑以下内容:
/recipe/search/?ingredients=contains=cherry
对此有何想法?这种过滤器有“标准”吗?
更新:我的想法之一是它在后端处理的方式(在我的案例中是Rails)。当使用这种特定格式查询服务器时,Rails会生成一个可能像以下一样丑陋的Ruby哈希:
{"ingredients"=>"contains=cherry",
"action"=>"search",
"controller"=>"recipe"}
答案 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)
首先,与其他答案相比,我将从REST
的角度出发,然后找到适当的补充。我在Ruby中并不强大,所以在后端使用无代码。
/recipies
/recipies/?sortby=date&sort=asc
/recipies/?ingredients=cherry
这就是构建基本URL的REST方式
对于多场比赛,没有正式的方法,但我会关注用户1758003。这是一个直观的url构造,很容易在后端解析,所以我们有/recipies/?ingredients=cherry,chocolate
不要忘记/recipies/search
不安宁,因为它镜像recipies
并且不代表独立实体。但是,它是为您网站的访问者托管搜索表单的好地方。
现在第一个问题还有其他问题,让我逐一解决:
在/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"}