REST API是否有任何命名约定准则?

jno*_*ris 207 api rest naming-conventions

在创建REST API时,API中的命名约定是否有任何指导或事实标准(例如:URL端点路径组件,查询字符串参数)?骆驼帽是常态还是下划线?其他?

例如:

api.service.com/helloWorld/userId/x
Run Code Online (Sandbox Code Playgroud)

要么

api.service.com/hello_world/user_id/x
Run Code Online (Sandbox Code Playgroud)

注意:这不是RESTful API设计的问题,而是用于最终路径组件和/或查询字符串参数的命名约定准则.

任何指导方针将不胜感激.

Lio*_*orH 149

我认为你应该避免使用驼峰帽.规范是使用小写字母.我也会避免使用下划线并使用破折号

所以你的URL应该是这样的(忽略你要求的设计问题:-))

api.service.com/hello-world/user-id/x
Run Code Online (Sandbox Code Playgroud)

  • 根据RFC2616,只有URL的方案和主机部分不区分大小写.URL的其余部分,即路径和查询应该区分大小写.http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.2.3 (183认同)
  • @LiorH:为什么你认为区分大小写"毫无意义"?许多其他情境对良好效果都是敏感的.有些Web服务(例如Amazon S3)*会对URL端点强制执行区分大小写,我认为这是非常合适的. (18认同)
  • 丹尼尔,你是对的,谢谢你指出了这一点.但是,事实上我们通常希望url忽略大小写,尤其是资源名称部分.userid和UserId行为不同是没有意义的(除非其中一个返回404) (9认同)
  • @Dennis Windows服务器文件系统默认情况下不区分大小写,除非我非常误以为http://technet.microsoft.com/en-us/library/cc725747.aspx (6认同)
  • @samspot好一个!我认为Windows在创建服务器时直接使用区分大小写的文件名.哇,他们仍然在尽可能长时间推动他们的方式,即"1 MicroSoft Way".;-) (5认同)
  • 你说你"也会避免下划线"*但你没有给出理由吗? (4认同)
  • URL的初衷是直接映射到服务器的文件系统.没有一个不区分大小写的文件系统,如果有的话,大概可以在40多个网络中访问.(DOS不用于运行服务器 - 不要去那里) (2认同)

S.L*_*ott 82

仔细查看普通网络资源的URI.这些是你的模板.想想目录树; 使用简单的类Linux文件和目录名称.

HelloWorld不是一个非常好的资源类.它似乎不是一个"东西".它可能是,但它不是很像名词.A greeting是一件事.

user-id可能是你正在取名的名词.但是,您的请求结果只是user_id,这是值得怀疑的.请求的结果更可能是用户.因此,user是你要获取的名词

www.example.com/greeting/user/x/
Run Code Online (Sandbox Code Playgroud)

我感觉合理.专注于使您的REST请求成为一种名词短语 - 通过层次结构(或分类法或目录)的路径.使用最简单的名词,尽可能避免使用名词短语.

通常,复合名词短语通常表示层次结构中的另一个步骤.所以你没有/hello-world/user//hello-universe/user/.你有/hello/world/user/hello/universe/user/.或者可能/world/hello/user//universe/hello/user/.

关键是在资源之间提供导航路径.

  • 我的问题更多的是关于最终路径名和/或查询字符串参数的命名约定,无论它们是什么.我同意你的设计建议,谢谢你,但是这个问题我只是询问命名约定. (4认同)

jz1*_*108 82

Dropbox,Twitter,Google Web ServicesFacebook的REST API 都使用下划线.

  • 其中一个副作用是,在Google的搜索索引中,强调的"单词"保持完整.被亵渎的人被分成单独的词. (20认同)
  • 虽然Google Maps API确实使用了下划线,但[Google风格指南](http://google-styleguide.googlecode.com/svn/trunk/jsoncstyleguide.xml?showone=Property_Name_Format#Property_Name_Format)需要Camel Case.[Google+ API](https://developers.google.com/+/api/latest/activities/list)和[自定义搜索API](https://developers.google.com/custom-search/json-api/v1/reference/cse/list)等使用Camel Case. (9认同)
  • 但是,他们仍然使用“-”作为这些网址的分隔符:P https://developers.google.com/custom-search/json-api/v1/reference/cse/list https://developers.google.com/+ / best-practices https://dev.twitter.com/overview/case-studies另一方面,它们在查询参数中使用camelCase。 (2认同)
  • 没人知道... (2认同)

Den*_*nis 30

'UserId'完全是错误的做法.动词(HTTP方法)和名词方法是Roy FieldingREST架构的意义.名词是:

  1. 事物的集合
  2. 件事

一个好的命名约定是:

[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
Run Code Online (Sandbox Code Playgroud)

其中{media_type}是以下之一:json,xml,rss,pdf,png,甚至html.

可以通过在末尾添加"s"来区分集合,例如:

'users.json' *collection of things*
'user/id_value.json' *single thing*
Run Code Online (Sandbox Code Playgroud)

但这意味着你必须记录你把's'和你没有的地方放在哪里.加上半个星球(亚洲人为首发)说的语言没有明确的复数,因此URL对他们不太友好.


aeh*_*lke 14

不,REST与URI命名约定无关.如果您将这些约定作为API的一部分包含在带外,而不是仅通过超文本,那么您的API不是RESTful.

有关更多信息,请参阅http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven

  • 给它一个休息......拥有漂亮的URL仍然很好. (42认同)
  • 总而言之,漂亮的网址很棒,每个人都应该拥有它们.它与REST无关. (5认同)
  • @mahemoff对不起,这是我超级迂腐.但是你的URL看起来与REST无关.这并不意味着他们不是一件好事,他们只是与REST描述的正交.说REST是以这种方式构建URL是错误的,因为它导致人们将RPC API描述为REST只是因为它们具有可读/结构化的URL. (4认同)

小智 9

域名不区分大小写,但URI的其余部分当然可以.假设URI不区分大小写是一个很大的错误.


Rob*_*hel 6

我在产品中使用的http://soaprobe.blogspot.co.uk/2012/10/soa-rest-service-naming-guideline.html上有一份准则列表。准则总是值得商...的...我认为一致性有时比使事情变得完美(如果有的话)更为重要。