REST按子实体获取父实体

时间:2019-02-27 00:08:12

标签: rest api-design restful-url

根据此处的示例What are best practices for REST nested resources?

来回答此问题

如果您想获取一名员工为其工作的公司,端点将是什么样?我可以看到的选项是:

  1. GET /companies?employeeId=x可能会返回employeeId = x
  2. 的公司列表
  3. GET /companies/by-employee/{employeeId}将返回一家公司。该端点从Linux系统上的/ dev / disks /符号链接中获得了一些启发。基本上,所有子实体都以公司为别名
  4. GET /employees/{employeeId}/company将返回一家公司并颠覆员工与公司之间的关系

1 个答案:

答案 0 :(得分:0)

  

如果您想获取一名员工为其工作的公司,端点将是什么样?

REST不在乎您为资源标识符使用什么拼写。

考虑浏览器在加载HTML页面时的工作方式。假设有一个img标签;标签为浏览器提供了所需的语义上下文,以便它可以发送对图像的请求(尤其是发送具有其首选 image 类型的请求)。浏览器不必解析URL,查找文件扩展名或类似的东西即可确定资源是图像。

尝试将语义编码为URI是错误的方法;语义属于links

如果您正在设计REST API,那么您想要的类似于

Link: </F4EEFDD3-44D9-41AD-8299-620ECD8765DB>; rel="https://schema.org/Organization"

翻译:此链接“指向”作为当前上下文组织的资源。

客户端和服务器需要签订合同,以HTML规范描述a elementsimg elements等语义的相同方式,描述可能的链接及其含义。上。

如果已准备就绪,则客户端通过跟随链接来遵循协议,并且服务器可以选择他们喜欢的任何链接拼写(例如,以充分利用caching的优势)。

如您所见,从客户端的角度来看,标识符的拼写无关紧要(与变量名的拼写无关紧要的事实非常相似)。

Link: </F4EEFDD3-44D9-41AD-8299-620ECD8765DB>; rel="https://schema.org/Organization"
Link: </companies?employeeId={employeeId}>; rel="https://schema.org/Organization"
Link: </companies/by-employee/{employeeId}>; rel="https://schema.org/Organization"
Link: </employees/{employeeId}/company>; rel="https://schema.org/Organization"

/companies?employeeId={employeeId}是一个方便的标识符,因为您还可以通过HTML的form processing rules利用它。

/companies/by-employee/{employeeId}/employees/{employeeId}/company可能很方便,因为您可以利用relative resolution和点段来链接到标识符层次结构中方便位置的其他资源。

推荐观看:蒂尔科夫的REST: I Don't Think It Means What You Think It Means