在创建REST API时,API内的命名约定是否有任何指导方针或事实上的标准(例如:URL端点路径组件,查询字符串参数)?驼色大写,还是下划线?其他人呢?
例如:
api.service.com/helloWorld/userId/x
or
api.service.com/hello_world/user_id/x
注意:这不是RESTful API设计的问题,而是用于最终路径组件和/或所使用的查询字符串参数的命名约定指南。
任何指导方针将不胜感激。
在创建REST API时,API内的命名约定是否有任何指导方针或事实上的标准(例如:URL端点路径组件,查询字符串参数)?驼色大写,还是下划线?其他人呢?
例如:
api.service.com/helloWorld/userId/x
or
api.service.com/hello_world/user_id/x
注意:这不是RESTful API设计的问题,而是用于最终路径组件和/或所使用的查询字符串参数的命名约定指南。
任何指导方针将不胜感激。
当前回答
不。REST与URI命名约定无关。如果您将这些约定作为API的一部分包含在带外,而不是通过超文本,那么您的API就不是RESTful的。
欲了解更多信息,请参见http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven
其他回答
不。REST与URI命名约定无关。如果您将这些约定作为API的一部分包含在带外,而不是通过超文本,那么您的API就不是RESTful的。
欲了解更多信息,请参见http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven
域名不区分大小写,但URI的其余部分肯定可以。假设uri不区分大小写是一个很大的错误。
“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*
但这意味着你必须记录你在哪里写了“s”,在哪里没有写。加上半个地球(首先是亚洲人) 说的语言没有明确的复数,所以URL对他们不太友好。
我不认为骆驼的情况是这个例子中的问题,但我认为对于上面的例子,一个更RESTful的命名约定应该是:
api.service.com/helloWorld/userId/x
而不是让userId作为一个查询参数(这是完全合法的),我的例子以一种更RESTful的方式表示该资源。
我认为在REST url中尽可能少地使用特殊字符是可取的。REST的好处之一是它使服务的“接口”易于阅读。Camel格式或Pascal格式可能适合于资源名称(Users或Users)。我不认为REST有什么严格的标准。
另外,我认为甘道夫是对的,在REST中不使用查询字符串参数通常更干净,而是创建定义你想要处理哪些资源的路径。
http://api.example.com/HelloWorld/Users/12345/Order/3/etc