在设计RESTful接口时,请求类型的语义被认为对设计至关重要。
- GET-列表收集或检索元素
- PUT-替换集合或元素
- POST-创建集合或元素
- DELETE-好吧,erm,删除集合或元素
但是,这似乎没有涵盖“搜索”的概念。
例如,在设计一套支持求职网站的Web服务时,您可能具有以下要求:
- 获取个人招聘广告
- GET来
domain/Job/{id}/
- GET来
- 创建招聘广告
- 发布到
domain/Job/
- 发布到
- 更新职位广告
- PUT到
domain/Job/
- PUT到
- 删除招聘广告
- 删除到
domain/Job/
- 删除到
“获得所有工作”也很简单:
- GET来
domain/Jobs/
但是,工作“搜索”如何落入这种结构?
您可以声称这是“列表集合”的变体,并实现为:
- GET来
domain/Jobs/
但是,搜索可能很复杂,完全有可能产生一个生成长GET字符串的搜索。也就是说,在这里引用SO问题,使用GET字符串的长度超过2000个字符存在一些问题。
一个示例可能是多面搜索-继续“工作”示例。
我可能会在以下方面进行搜索-“技术”,“职位名称”,“学科”以及自由文本关键字,工作年龄,位置和薪水。
凭借流畅的用户界面和大量技术和职务,搜索可以包含大量方面的选择是可行的。
通过将此示例调整为简历而不是职位,可以带来更多的方面,您可以很容易地想象出搜索时选择了100个方面,甚至只是40个方面(每个方面50个字符)(例如,职务,大学名称,雇主名称)。
在那种情况下,可能需要移动PUT或POST,以确保将正确发送搜索数据。例如:
- 发布到
domain/Jobs/
但是从语义上讲,这是创建集合的指令。
您也可以说这将表示为搜索的创建:
- 发布到
domain/Jobs/Search/
或(如下面的燃烧语法所建议)
- 发布到
domain/JobSearch/
从语义上看,这似乎很有意义,但是您实际上并没有创建任何东西,而是在请求数据。
因此,从语义上讲,这是一个GET,但不能保证GET支持您所需要的。
因此,问题是-尝试尽可能地遵循RESTful设计,同时确保我保持在HTTP的限制之内,最适合搜索的设计是什么?
domain/Jobs?keyword={keyword}
。这对我来说很好:)我的希望是,该SEARCH
动词将成为一个标准。programmers.stackexchange.com/questions/233158/...