实现GET REST API以检查数据库中是否存在给定URL的最佳方法是什么。
每个GET请求将包含以下部分:主机名,端口,源,路径和查询。
我的想法是按如下方式设置资源。
/urlservice/1/{hostname}/{port}/{origin}/{path}/{query}
但这看起来非常冗长,因为它会导致资源网址如:
/urlservice/1/google.com/80/"https://google.com/"/"/search"/"?q=aba"
有什么更好的设计方法?
答案 0 :(得分:0)
设计URI结构时REST的主要警告是遵循URI规范。话虽如此,查看关于结构的URI规范,它有几个重要的注释来帮助你解决问题:
1.2.3. Hierarchical Identifiers
URI语法按层次结构组织,其中列出了组件 从左到右依次递减的顺序。对于某些URI 方案,可见层次结构仅限于方案本身: 考虑方案组件分隔符(“:”)之后的所有内容 对URI处理不透明。其他URI方案构成层次结构 通用解析算法的显式和可见。
通用语法使用斜杠(“/”),问号(“?”)和
数字符号(“#”)字符用于分隔为
的组件 对于泛型解析器的层次解释很重要 标识符...
现在关于查询字符串:
查询组件包含非分层数据 路径组件中的数据(第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
通过谷歌服务。这也意味着如果谷歌改变了他们的服务参数,所有客户都不会改变。只有谷歌服务会改变其网址构建器的内部实现。