使用URL作为资源设计RESTFul GET

时间:2018-04-03 02:12:52

标签: rest web-services url flask api-design

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

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

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

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

但这看起来非常冗长,因为它会导致资源网址如:

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

有什么更好的设计方法?

2 个答案:

答案 0 :(得分:0)

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

1.2.3. Hierarchical Identifiers

  

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

     

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

现在关于查询字符串:

3.4. Query

  

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

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

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

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

答案 1 :(得分:0)

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

/urlservice/1/{service}/{request}

服务将基于服务'所以谷歌搜索服务会知道如何建立一个谷歌搜索网址:

/urlservice/1/google/aba

将解决:

https://google.com/search/?q=aba
通过谷歌服务

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