- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建一个 REST API,并且我有一些关系使我的链接很长。他们对我来说很有意义,但这是一团糟。我不确定处理此问题的最佳方法是什么。这么长的链接有问题吗?我这样做违反原则了吗?我该如何处理这样的关系?
下面的例子有点做作,但它说明了我正在尝试做的事情。
一个公司有很多部门。每个部门都有很多员工。每个员工可以拥有多台计算机。每台计算机上都可以有很多文档。
GET
特定文档的路径是:
/companies/:companyId/departments/:departmentId/employees/:employeeId/computers/:computerId/documents/:documentId
每个 ID 在该层内都是全局唯一的——在整个系统中没有两个文档 ID 是相同的,但文档 ID 可以与员工 ID 相同。
这对我来说很有意义,因为每一层都只与它上面的一个事物相关联。一个部门将只属于一个公司,一个员工只属于一个部门,一台计算机只属于一个员工,一份文件只属于一台计算机。
我可以将它们分解成单独的端点,例如 /computers
,但是我怎么知道在哪里分解它们呢?为什么我会选择 /computers
而不是 /employees/:employeeId/computers
作为端点?
最佳答案
在这个例子中,我会将这些资源中的每一个都移到顶级。每个顶级资源都可以有下一个“级别”作为成员。所以,
/companies
/companies/{id}
/companies/{id}/departments
/departments
etc..
如果最终用户确实需要操作集合的内容,我只会添加子资源。
深度嵌套的资源是有问题的。 3 个月后,如果您收到业务要求,要查找为公司 {id} 工作的所有员工(无论部门如何),会发生什么情况?将员工作为顶级资源,您可以添加对 GET/employees?companyId={id}
的支持。在您上面展示的设计中,您的选择都是错误的。当您像现有的那样形式化嵌套结构时,您放弃的资源之间的关系有很大的灵 active 。
就您的一些具体问题而言:
I'm building a REST API
REST 在 URI 设计方面完全不可知。
I have some relationships that are making my links very long. They make sense to me, but it's a mess. [..] Is it a problem to have links that are so long?
希望最终用户永远不会输入这些内容。如果您的 API 确实是 RESTful,那么客户将使用您返回的链接,他们也不应该输入这些链接。在 RESTful 系统中,我希望“我有一些 X”关系保存在链接中,而不仅仅是通过 URI 的形状记录。我同意它们偏长,并且出于上述原因我会更改它们,但我认为您的具体顾虑不是更改它们的充分理由。
Am I violating a principle with these?
据我所知不是。
关于rest - 在 REST API 中处理非常深的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39856391/
拿这个: var lists:{ item1:{} ,item2:{} ,item3:{} ,item4:{} } 由于它基本上是空的,我想要一个函数(可能但不一定是 _lodash
我想更改 ng bootstrap 分页组件的样式并在 Angular 6 应用程序中使用 /deep/ 链接。以下代码工作正常,但控制台显示警告,指出该代码已被弃用。 那么,我应该如何更改它以消除警
使用 webcomponents,您可以使用 /deep/ 定位 shadowdom 的内部元素,在我尝试使用事件委托(delegate)之前它工作正常。 一个常规的点击功能将起作用: $('html
在 Swift 中,我试图实现一个单词 Trie,使用文字表示作为一系列嵌套的 NSObject。这是 Trie。 let GEENITRIE:NSObject = [ "i":[
运行 npm update 更新 package.json 中列出的项目;但是,这些项目的依赖关系仍然过时。 明显的解决方法是再次运行 npm update。有时我需要运行它 3 次以上才能使 npm
我创建了 2 级嵌套 linq 查询: var data = (from p in Departments join e in Employees on p.Id equals
首先是代码 #include typedef wchar_t* BSTR; wchar_t hello[] = L"Hello"; class _bstr_t { public: opera
我要编写一个 lisp 程序来生成十六进制数的实际值。我已经编写了一个函数,但似乎出现了 stackoverflow(深度)错误。我想知道是否有人可以指出我的错误或指导我朝着正确的方向前进。 如果没有
我想将每种类型都转换为boolean 或object type CastDeep = { [P in keyof T]: K extends K[] ? K[] : T[P] ex
我刚刚发现自己在写这个: fn init_timestamps(dir: &PathBuf, file_timestamps: &'static HashMap) { match fs::re
我有一个现有的 pybind11::array_t,需要进行复制构造。 pybind11 中是否有一个函数允许我对 array_t 进行深度复制? 我知道我可以创建一个新的 array_t,适当调整大
引用http://www.devx.com/tips/Tip/13291 ,它说我可以使用 memcpy 来复制由 sizeof() 确定的大小,但是,数组不是指向指针吗? 除了遍历数组,如何使用 m
我有多个成员(member),每个成员(member)都有一条记录,其中包含几个备注字段: Member ID Entry A Entry B 1 [memo t
$watchCollection 是否能够忽略对以 $ 开头的属性的更改?使用深度 $watch 时已经存在此行为,因为它依赖于 angular.equals 进行比较。 理想情况下,$watchCo
我有一个带有复杂键的 map - 例如,二维数组: m := make(map[[2][3]int]int) 当我在映射中插入一个新键时,Go 是否会对该键进行深度复制? a := [2][3]int
我需要查询如下所述的三个表。我了解简单的 JOIN,但是这个有点超出我的水平。 courses 有两列 id (PK) 和 courseTitle(示例 id 1,courseTitle 物理) cl
我有一个对象,它是 Realm 的 Object 子类,并且符合 Codable 以便在与 API 对话时与 JSON 相互转换。 如何利用 Codable 协议(protocol)进行深度复制(包括
我是一名优秀的程序员,十分优秀!