RESTFul媒体类型继承
我对休息完全陌生。我帮助实现了一个叫做“工作时休息”的东西,但它违反了很多规则,所以很难将其定义为休息。我想遵循HATEOAS指南,剩下的问题是关于媒体类型及其规格的文档。也就是说,一种媒体类型实际上是另一种媒体类型的扩展 例如,我决定将“application/hal+json”作为基本媒体类型。用户将收到的所有内容都将是带有一些附加字段的HAL blob。我不想把我的媒体类型仅仅称为“application/hal+json”,在我看来,应该有更多的信息可用,但我想清楚的是,除了作为我数据的额外字段之外,这就是它们。此外,我的系统最终将继承其中一些字段,例如请求(不是HAL BLOB)和响应格式。一般的“用户”类型可能只有一个用户id和名称,例如,“学生”或“教师”之类的扩展将有不同的附加字段RESTFul媒体类型继承,rest,hateoas,media-type,Rest,Hateoas,Media Type,我对休息完全陌生。我帮助实现了一个叫做“工作时休息”的东西,但它违反了很多规则,所以很难将其定义为休息。我想遵循HATEOAS指南,剩下的问题是关于媒体类型及其规格的文档。也就是说,一种媒体类型实际上是另一种媒体类型的扩展 例如,我决定将“application/hal+json”作为基本媒体类型。用户将收到的所有内容都将是带有一些附加字段的HAL blob。我不想把我的媒体类型仅仅称为“application/hal+json”,在我看来,应该有更多的信息可用,但我想清楚的是,除了作为我数据的
在媒体类型本身的某个地方表示此扩展是否有意义?人们通常在HATEOAS文档链接中记录关系吗?如果是这样,这里的总趋势是什么?我希望我的API易于使用,因此认为它应该遵循可用的规范。这个问题是一个非常开放的讨论,它实际上取决于不同的工程师如何解释REST标准和最佳实践。尽管如此,作为一名具有足够REST服务开发经验的软件工程师同事(在专业方面也面临着与您相同的问题),我想在这里补充我的意见 REST服务开发规则严重依赖于url定义。以这样一种方式公开api是非常重要的,您的客户端只需查看url定义就可以准确地了解每个api发生了什么 话虽如此,不同的客户(以及不同的工程师)对最佳实践的看法也不同。例如,如果您试图通过电子邮件搜索用户,至少有两种方法 1)
GET/users/email/{email}
//客户端可以将其解释为
“通过电子邮件获取用户”
2) GET/users?email={email}
//客户端可以将其解释为
由于查询参数,“通过电子邮件搜索用户”
3) GET/users/email={email}
//这可以解释为#1
这取决于开发人员希望如何公开此api,以及他们如何为客户端记录此api。从不同的角度来看,所有这些方法都是正确的
现在具体谈谈你的问题。以下是我的方法在“User
”、“Student
”和“Teacher
”方面的表现
我把这三个都看作是独立的资源?为什么?因为它们是独立的类型,即使其中2个是从第3个扩展而来的。现在,我的API在这些方面会是什么样子
学生:
1) 检索学生列表:GET/students
2) 正在检索id为的学生:GET/students/{id}
3) 创建学生:发布/students
4) 更新学生:放置/students/{id}
5) 删除学生:删除/students/{id}
6) 搜索学生:获取
/students?{whateverQueryParamsYouWantForSearch}
同样的情况也适用于教师
现在为用户
1) GET/users
:检索所有用户的列表(student
和
教师
)
2) GET/users?type={type}
:这里是kicker。您可以指定
键入“学生”或“教师”,您将返回特定学生的数据
类型(当然正确记录)
3) POST/users?type={type}
:创建特定类型的用户
(学生
或教师
)
。。等等
主要区别是。。根url为/users
的API可用于这两种类型的用户(前提是始终为客户端指定并记录该类型)。而Student
和Teacher
api是特定于这些类型的
我的钱总是花在特定类型上,而一般类型用于搜索(意味着搜索两种类型的用户..使用/users?params
)。对于客户来说,这是了解发生了什么最简单的方法。即使记录它们也要容易得多
最后谈谈HATEOAS。是的,这是标准的一部分,最佳实践是始终提供指向您返回的资源的url/链接,或者如果您的返回对象很复杂,并且包含其他资源,这些资源可能包含可能通过API公开的资源。比如说,
/users?type=student&email=abc@abc.com
将使用该电子邮件返回所有用户,最好在此处遵循HATEOAS,并为每个返回的用户提供一个url,使url看起来像:/students/{id}
。这就是我们通常处理HATEOAS的方式
这就是我要补充的全部内容。正如我早些时候所说,这是一个非常开放的讨论。每个工程师对标准的解释都不同,没有一种方法可以处理所有用例。这里有一些基本规则,如果您遵循这些规则,客户机和其他开发人员会为您鼓掌:)关于您转向真正的RESTful架构,我想指出几点 首先,RESTful API必须执行内容协商。说您的基类型是hal+json似乎很奇怪。听起来你想要像parent+hal+json或者hal+json这样的类型;类型=父项。这意味着您的客户机必须特别了解这些类型……这不是非常RESTful的,因为它只是一个本地实现。这在天气很好