在创建REST API时,是否有任何指南或事实标准来规范API中的命名约定(例如:URL端点路径组件、查询字符串参数)?是驼峰命名法常见,还是下划线?还是其他方式?
例如:
api.service.com/helloWorld/userId/x
或者api.service.com/hello_world/user_id/x
注意:这不是关于RESTful API设计的问题,而是关于最终路径组件和/或查询字符串参数使用的命名约定指南。
任何指南将不胜感激。
在创建REST API时,是否有任何指南或事实标准来规范API中的命名约定(例如:URL端点路径组件、查询字符串参数)?是驼峰命名法常见,还是下划线?还是其他方式?
例如:
api.service.com/helloWorld/userId/x
或者api.service.com/hello_world/user_id/x
注意:这不是关于RESTful API设计的问题,而是关于最终路径组件和/或查询字符串参数使用的命名约定指南。
任何指南将不胜感激。
我认为你应该避免使用驼峰命名法。通常使用小写字母。我也会避免使用下划线,改用破折号。
所以你的URL应该看起来像这样(忽略设计问题,因为你要求的是这样的)
api.service.com/hello-world/user-id/x
针对 Dropbox、Twitter、Google Web Services 和 Facebook 的 REST API 都使用下划线。
仔细观察普通 Web 资源的 URI。这些是你的模板。想想目录树;使用类似于 Linux 的简单文件和目录名称。
HelloWorld
不是一个真正好的资源类别。它似乎不是一个“东西”。可能是,但它不太像名词。一个 greeting
是一个东西。
user-id
可能是你要获取的名词。然而,你请求的结果很可能不只是一个 user_id。更有可能的是请求的结果是一个 User。因此,user
是你要获取的名词。
www.example.com/greeting/user/x/
我觉得这个说法有道理。重点是让你的REST请求成为一种名词短语——一条通过层次结构(或分类法、目录)的路径。尽可能使用最简单的名词,避免使用名词短语。
通常,复合名词短语通常意味着你的层次结构中有另一个级别。所以你不会用/hello-world/user/
和/hello-universe/user/
。你需要用/hello/world/user/
和hello/universe/user/
或者可能是/world/hello/user/
和/universe/hello/user/
。
关键是提供资源之间的导航路径。
'UserId'是完全错误的方法。动词(HTTP方法)和名词方法是Roy Fielding为REST架构所设计的。名词可以是以下两种之一:
一个好的命名约定是:
[POST or Create](To the *collection*)
sub.domain.tld/class_name.{media_type}
[GET or Read](of *one* thing)
sub.domain.tld/class_name/id_value.{media_type}
[PUT or Update](of *one* thing)
sub.domain.tld/class_name/id_value.{media_type}
[DELETE](of *one* thing)
sub.domain.tld/class_name/id_value.{media_type}
[GET or Search](of a *collection*, FRIENDLY URL)
sub.domain.tld/class_name.{media_type}/{var}/{value}/{more-var-value-pairs}
[GET or Search](of a *collection*, Normal URL)
sub.domain.tld/class_name.{media_type}?var=value&more-var-value-pairs
其中{media_type}之一为:json、xml、rss、pdf、png,甚至是html。
还可以通过在末尾添加's'来区分集合,例如:
'users.json' *collection of things*
'user/id_value.json' *single thing*
不。REST与URI命名规范无关。如果您将这些约定作为API的一部分,通过超文本之外的方式进行传递,而不仅仅是通过超文本,则您的API不符合RESTful标准。
了解更多信息,请参见http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven
域名不区分大小写,但URI的其余部分可以区分大小写。假设URI不区分大小写是一个大错误。
我有一份准则清单,位于http://soaprobe.blogspot.co.uk/2012/10/soa-rest-service-naming-guideline.html,我们已在生产中使用。准则总是有争议的... 我认为保持一致性有时比完美更重要(如果有这种事情的话)。
我认为在这个例子中,驼峰式命名并不是问题所在,但我想对上面的例子使用更符合RESTful规范的命名约定:
api.service.com/helloWorld/userId/x
而不是将userId作为查询参数(这是完全合法的),我的例子以一种更符合RESTful规范的方式表示了资源。
我认为在REST URL中尽可能少使用特殊字符是更好的选择。 REST的一个好处是使服务的“接口”易于阅读。骆驼命名法或帕斯卡命名法可能适用于资源名称(Users或users)。我认为REST没有真正的硬标准。
此外,我认为甘道夫是正确的,在REST中通常不使用查询字符串参数会更清晰,而是创建定义要处理哪些资源的路径。