在制作 RESTful api 时,是否有推荐的方法来处理涉及多个查询的 "route" 语法?
In making a RESTful api, is there a recommended way to handle "route" syntax involving multiple queries?
我开始开发一个应用程序,它将收到一条“路线”作为 json。也就是说,“路由”本身将作为字符串传递给包含在 json 字符串中的服务器。我想使用 RESTful 编写路由的标准方式,以便以后更容易调试。但举例如下:
contact 'get all contacts
contact/:id 'get the contact by id
Ugly areas:
contact/:id/jobs 'get the contact and all jobs assigned to contact
contact/:id/jobs/filter 'get the contact and all jobs assigned to contact,
'where those jobs meet a certain criteria (filter)
现在我可以通过在“/jobs”上设置 CRUD 路由来避免在“jobs”上过于冗长的路由,我会这样做。但是,如果我想像上面那样限制返回给特定联系人的“工作”,有没有一种方法可以在不制定新约定的情况下表示该查询?
就 RESTful 体系结构而言,实际上,您拥有的很好。更严格的 RESTful 模式可能如下所示:
/jobs?contact_id=73284
/jobs?contact_id=73284&completed=1
其中 73284
是您联系人的唯一 ID,completed=1
表示过滤器。
了解严格的 RESTful 原则很有用,但实际上不可能 100% 合规。
一般来说,模式是:
METHOD:/resource/represention?any=query&string=you&want=here
或
METHOD:/resource?any=query&string=you&want=here
其中 METHOD
是 GET、PUT、POST、PATCH 或 DELETE。 resource
是一个 class 的东西(想想 table 名字),representation
是一个特定的东西(想想 table 行),查询参数就像你在 SQL.
中放入 WHERE 子句
在我看来,尝试使用查询,restful对我来说主要是有意义的
contact/:id/jobs
=>contact/:id?populate=jobs
// 如果你想联系工作,这意味着你仍然想要联系,只是一些额外的信息
contact/:id/jobs/filter
=>contact/:id?populate=jobs&jobs[xx]=xx
filter 也意味着额外限制
/jobs?contact_id=xx
这意味着你想要工作列表,还有一些额外的限制
REST 不关心您对资源标识符使用什么拼写约定。只要你的拼写符合RFC 3986描述的产生式规则就可以了。
如果你有很多类似的资源,使用URI Templates和变量扩展来定义你的标识符族会很方便。这允许客户端使用通用库来构建您的标识符,并允许您选择使用通用库为每个请求从目标 URI 中解析信息。
除了一些纯粹的机械问题(例如:使用正确的转义序列)之外,无论您是在查询中使用变量扩展,还是在路径段中,还是在每个段中使用多次,等等,都没有关系。
需要权衡取舍——路径段与 relative resolution 结合得很好; application/x-www-form-urlencoded 键值对与 HTML 形式结合得很好。
除此之外,机器不在乎。因此,请选择让您关心的某些人的事情变得更容易的任何拼写。
我开始开发一个应用程序,它将收到一条“路线”作为 json。也就是说,“路由”本身将作为字符串传递给包含在 json 字符串中的服务器。我想使用 RESTful 编写路由的标准方式,以便以后更容易调试。但举例如下:
contact 'get all contacts
contact/:id 'get the contact by id
Ugly areas:
contact/:id/jobs 'get the contact and all jobs assigned to contact
contact/:id/jobs/filter 'get the contact and all jobs assigned to contact,
'where those jobs meet a certain criteria (filter)
现在我可以通过在“/jobs”上设置 CRUD 路由来避免在“jobs”上过于冗长的路由,我会这样做。但是,如果我想像上面那样限制返回给特定联系人的“工作”,有没有一种方法可以在不制定新约定的情况下表示该查询?
就 RESTful 体系结构而言,实际上,您拥有的很好。更严格的 RESTful 模式可能如下所示:
/jobs?contact_id=73284
/jobs?contact_id=73284&completed=1
其中 73284
是您联系人的唯一 ID,completed=1
表示过滤器。
了解严格的 RESTful 原则很有用,但实际上不可能 100% 合规。
一般来说,模式是:
METHOD:/resource/represention?any=query&string=you&want=here
或
METHOD:/resource?any=query&string=you&want=here
其中 METHOD
是 GET、PUT、POST、PATCH 或 DELETE。 resource
是一个 class 的东西(想想 table 名字),representation
是一个特定的东西(想想 table 行),查询参数就像你在 SQL.
在我看来,尝试使用查询,restful对我来说主要是有意义的
contact/:id/jobs
=>contact/:id?populate=jobs
// 如果你想联系工作,这意味着你仍然想要联系,只是一些额外的信息
contact/:id/jobs/filter
=>contact/:id?populate=jobs&jobs[xx]=xx
filter 也意味着额外限制
/jobs?contact_id=xx
这意味着你想要工作列表,还有一些额外的限制
REST 不关心您对资源标识符使用什么拼写约定。只要你的拼写符合RFC 3986描述的产生式规则就可以了。
如果你有很多类似的资源,使用URI Templates和变量扩展来定义你的标识符族会很方便。这允许客户端使用通用库来构建您的标识符,并允许您选择使用通用库为每个请求从目标 URI 中解析信息。
除了一些纯粹的机械问题(例如:使用正确的转义序列)之外,无论您是在查询中使用变量扩展,还是在路径段中,还是在每个段中使用多次,等等,都没有关系。
需要权衡取舍——路径段与 relative resolution 结合得很好; application/x-www-form-urlencoded 键值对与 HTML 形式结合得很好。
除此之外,机器不在乎。因此,请选择让您关心的某些人的事情变得更容易的任何拼写。