为 REST GET 查询指定投影是否违反 REST 原则和/或这是一个好习惯?
考虑一个类似的 api /person?fields=fname,lname, address
,这可能是因为 person 是一个大模型,而对于我目前的要求,我只需要给定字段的值(比如我正在创建一个 UI 网格)
1 回答
如果当前资源不支持您想要的,则完全可以定义新资源。这正是 REST 的工作原理。
因此,在您的情况下,/person?fields=fname,lname, address
URI 定义是完全有效的。
请注意,URI 结构无关紧要,您必须在描述 URI 模板和变量的地方提供指向客户端的链接。所以你应该返回一个类似这样的链接(虚构的超媒体 JSON 格式):
{
"_links": {
"/meta/person/list": {
"href": "/person{?fields}",
"vars": {
"fields": {
"required": false,
"composition": [
"fname": {
"meta": "/meta/person/fname"
},
"lname": {
"meta": "/meta/person/lname"
},
"address": {
"meta": "/meta/person/address",
"alternatives": {
"href": "/locations",
"meta": "/meta/locations"
}
}
]
}
}
}
}
}
其中/meta
描述了每个参数的类型和标签:
获取 /meta/person/fname
{
"type": "string",
"label": "First name",
"_links": {
"self": {
"href": "/meta/person/fname"
}
}
}
办公室。您与客户的第一步应该是获取整个元数据或至少是其中最常用的部分。通过处理链接,客户端必须能够理解元描述和这种特殊的超媒体 JSON 格式。URI 结构完全无关紧要,它应该只使用元数据来了解链接是什么,以及如何使用它。
不幸的是,我们目前没有关于如何描述 JSON 响应中的链接的标准。有超媒体格式,如Hydra + Json-LD、HAL、HyperSchema等……但是 afaik。它们都不是标准。(可能 Hydra RDF 词汇是最接近的词汇,但它肯定还没有准备好生产。Json-LD 已经是表示 RDF 的标准方式。)
现在,如果将如何构建/person?fields=fname,lname,address
URI 及其含义硬编码到您的客户端中,那么它就不是 REST 客户端,因为这种服务/客户端违反了REST 的统一接口/ HATEOAS约束。办公室。现在的人。将所有内容都称为 REST、RESTful、API,即使他们对这个主题的了解与 Jon Snow 一样多。顺便提一句。如果您不想以 REST 方式实现您的 Web 应用程序,这没有什么可悲的,它只取决于您的要求。例如,如果您的应用程序没有很多用户和 3rd 方开发人员,那么您选择哪条路径很可能并不重要。