我有一个带有RESTful-ish URL的rails应用程序,我需要传入一个字符串(标签)集合,我不想使用查询字符串。
目前我使用的路线类似于/controller/tagged/:tags/foo/:foo/bar/:bar.:format
这需要对'标签'进行编码,如果您想手动将URL输入某些内容,这会很容易出错。
/ controller / tagged / tag1 / tag2 / tag3 / foo等其他方法很难,因为它们不明确(标签列表的结束位置和其他参数的开始并不清楚。)
其他人如何处理这类事情以及将其表达为铁路线的解决方案是什么?
答案 0 :(得分:4)
假设您正在尝试GET
资源,也许是“问题列表”,并且您希望根据一组“标记”过滤列表(这真是一个好主意!)。
您的网址应该是资源的路径。也许/questions
可能是一个很好的网址。我知道你不想为你的标签使用URL参数,但是在GET上,这就是它们的用途 - 过滤或自定义资源视图。因此,要过滤一些感兴趣的主题而不是获得所有问题,您的网址可能如下所示:
/questions?tag=ruby-on-rails&tag=restful&tag=url-routing
我相信这是RESTful方式。替代品可能是可口的,但我认为它们会违反REST的“纯粹主义”形式。
答案 1 :(得分:2)
使用查询字符串。正是出于这个目的:将编码的参数传递给资源。
使用路径元素的版本模糊了/controller/tagged
是要查询的实际资源这一事实,并将标记作为请求的参数。
要了解路径方法不是RESTful的原因,请考虑以下两个网址:
http://example.com/controller/tagged/foo/bar
http://example.com/controller/tagged/bar/foo
根据您提供的描述,这些应该引用标记项目的相同虚拟集合。但是,在RESTful系统中,URL明确地引用一个且仅一个资源。基于路径的寻址将许多URL与单个结果相关联。
答案 2 :(得分:1)
Sam Ruby和Leonard Richardson在他们的书 Restful Web Services 中建议用逗号或分号(以及算法资源的查询变量)分隔非分层数据。
答案 3 :(得分:-1)
你可以随时发布它们。