RESTFul媒体类型继承

RESTFul媒体类型继承,rest,hateoas,media-type,Rest,Hateoas,Media Type,我对休息完全陌生。我帮助实现了一个叫做“工作时休息”的东西,但它违反了很多规则,所以很难将其定义为休息。我想遵循HATEOAS指南,剩下的问题是关于媒体类型及其规格的文档。也就是说,一种媒体类型实际上是另一种媒体类型的扩展 例如,我决定将“application/hal+json”作为基本媒体类型。用户将收到的所有内容都将是带有一些附加字段的HAL blob。我不想把我的媒体类型仅仅称为“application/hal+json”,在我看来,应该有更多的信息可用,但我想清楚的是,除了作为我数据的

我对休息完全陌生。我帮助实现了一个叫做“工作时休息”的东西,但它违反了很多规则,所以很难将其定义为休息。我想遵循HATEOAS指南,剩下的问题是关于媒体类型及其规格的文档。也就是说,一种媒体类型实际上是另一种媒体类型的扩展

例如,我决定将“application/hal+json”作为基本媒体类型。用户将收到的所有内容都将是带有一些附加字段的HAL blob。我不想把我的媒体类型仅仅称为“application/hal+json”,在我看来,应该有更多的信息可用,但我想清楚的是,除了作为我数据的额外字段之外,这就是它们。此外,我的系统最终将继承其中一些字段,例如请求(不是HAL BLOB)和响应格式。一般的“用户”类型可能只有一个用户id和名称,例如,“学生”或“教师”之类的扩展将有不同的附加字段


在媒体类型本身的某个地方表示此扩展是否有意义?人们通常在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的,因为它只是一个本地实现。这在天气很好