以 URL 为资源设计 RESTFul GET

Posted

技术标签:

【中文标题】以 URL 为资源设计 RESTFul GET【英文标题】:Design RESTFul GET with URL as resource 【发布时间】:2018-09-12 06:11:31 【问题描述】:

实现 GET REST API 以检查给定 URL 是否存在于数据库中的最佳方法是什么。

每个 GET 请求将包含以下部分:主机名、端口、来源、路径和查询。

我的想法是按如下方式设置资源。

/urlservice/1/hostname/port/origin/path/query

但这似乎很冗长,因为它会导致资源网址如下:

/urlservice/1/google.com/80/"https://google.com/"/"/search"/"?q=aba"

有什么更好的设计方法?

【问题讨论】:

只需将 URL 作为查询参数传递。确保对它进行 url 编码 【参考方案1】:

在设计 URI 结构时,REST 的主要警告是您遵循 URI 规范。话虽如此,查看 URI 规范的结构,它有几个重要的注释可以帮助您解决问题:

1.2.3. Hierarchical Identifiers

URI 语法是分层组织的,组件列在 重要性从左到右递减的顺序。对于某些 URI 方案,可见层次结构仅限于方案本身: 考虑方案组件分隔符(“:”)之后的所有内容 对 URI 处理不透明。其他 URI 方案使层次结构 对通用解析算法显式且可见。

通用语法使用斜杠(“/”)、问号(“?”)和 用数字符号 ("#") 字符分隔组件 对通用解析器的层次解释很重要 标识符...

现在关于查询字符串:

3.4. Query

查询组件包含非分层数据,以及 路径组件(第 3.3 节)中的数据,用于识别 URI 方案和命名机构范围内的资源 (如果有的话)。查询组件由第一个问题表示 标记 ("?") 字符并以数字符号 ("#") 字符结尾 或者在 URI 的末尾...

通过以上所述,查看您的 URI,您需要确定您的结构是否是分层的,以遵循 URI 规范来满足 REST。当然,这里有一点主观性,但是看看你所拥有的,你调用的大多数(如果不是全部)参数看起来像是在查询字符串中使用的候选者,因为它是非分层的。为此,我建议将它们移至查询字符串。

/urlservice/1?hostname=hostname&port=port&origin=origin&path=path&query=query

同样,由于存在一些主观性,并且您比其他人更了解自己的领域,因此请使用上述指导并做出最佳判断。

【讨论】:

【参考方案2】:

您可以将其分解为基于服务,而不是在请求中指定所有内容:

/urlservice/1/service/request

服务将是“基于服务”的,因此 google 搜索服务将知道如何构建 google 搜索 url:

/urlservice/1/google/aba

将被解析为:

https://google.com/search/?q=aba

由谷歌服务。这也意味着如果谷歌改变了他们的服务参数,所有的客户都不必改变。只有 google 服务会更改其 url 构建器的内部实现。

【讨论】:

以上是关于以 URL 为资源设计 RESTFul GET的主要内容,如果未能解决你的问题,请参考以下文章

RESTful API - 设计子资源

RESTful

用于搜索单个资源的 RESTful URL 设计

Restful API

restful架构风格设计准则资源识别的注意事项

RESTful 规范