2012-07-17 84 views
1

restful api必须使用get,post,put或delete请求方法。提交的行为和数据完全由uri字符串决定。没有查询参数或变量。restful api只使用干净的URL - 没有url变量或post变量

这是真的吗?

有效期:http://example.com/foo/84

有效:http://example.com/foo/?value=84

有效期:

$.ajax({ 
  type: 'POST', 
  url: "http://example.com/foo/84", 
  success: success, 
  dataType: dataType 
}); 

有效:

$.ajax({ 
    type: 'POST', 
    url: "http://example.com/foo/", 
    data: 84, 
    success: success, 
    dataType: dataType 
}); 

编辑 目前为止有两个答案,而且相互矛盾。

回答

-3

http://example.com/foo/?value=84是无效的并非完全正确。我的意思是,只要它是一个有效的URL,它就可以工作,并且你可以通过get或post获取参数。另一方面,REST是一种体系结构,它的一个要求是一个干净的URL(不包括具有'?'的参数),所以这样的URL不被认为是像URL那样的REST。

所以,如果你打算建立一个基于REST的应用程序,你应该只使用干净的URL。

编辑:

我从注释中看到下面有一个问题了解什么是REST,所以我会尽力举一个简单的例子:

  1. 为了得到数据你会可能使用http://example.com/foo/84作为获取请求,其余FW知道获取id为84的资源foo。
  2. 为了发布关于foo的数据,您可以将http://example.com/foo/84作为POST请求,现在其他FW知道自从它发布请求会调用负责处理邮件的方法而不是处理邮件的方法获取
  3. 要删除,请使用DELETE操作调用相同的URL,我想其他人都知道。

所以,尽管你有相同的URL,它真的很重要,如果它的GET/POST/PUT/DELETE请求。

+0

啊两个对立的答案... – NimChimpsky 2012-07-17 13:07:29

+0

我不认为我们的答案不同意,尽管他们的表述不同。要将Web API视为RESTful,需要遵循特定模式。 '/ foo /?value = 84'会起作用,这是真的,但它不会是一个REST API。如果您以这种方式访问​​资源,您将错过REST API的某些优势,尤其是缓存。 – 2012-07-17 13:32:06

+0

@Laurent yr回答中的第二个示例在url中使用查询参数。它不干净,但你说它是宁静的。鉴于这个答案说宁静不能在get请求中使用url参数。 – NimChimpsky 2012-07-17 13:50:40

3

POST变量绝对没问题否则你将如何提交新资源或更新它?

GET参数可以很好地指定如何呈现资源。所以确实http://example.com/foo/?value=84是不正确的 - 该URL不代表资源。

但是,http://example.com/user/84?fields=first_name,last_name会没事的。在这种情况下,您可以使用其他查询参数来指定您只需要该资源的名和姓。

+0

帖子变量:通过指定url中的数据,我认为这有点说实话。 – NimChimpsky 2012-07-17 12:59:31

+0

@NimChimpsky想想数据和表达之间的区别。例如,用户列表可以通过/用户访问,但也可以按姓氏/用户排序?sort = lastname。它仍然是相同的数据,只是略有不同。 – 2012-07-17 13:03:03

+0

@ZetaTwo到底是具体定义的呢?这是使用http请求访问和检索数据的另一个名称,据我所知。它建议使用删除和放置删除和插入数据的惯例?另一个答案与这个btw相矛盾。 – NimChimpsky 2012-07-17 13:05:02

5

这里有第三个答案与另外两个相矛盾。

RESTful URI几乎是一个矛盾。 URI的语义与REST无关,唯一对REST至关重要的是一个URI只能标识一个资源。除此之外,URI是一个原子标识符,其语义无关紧要。

休息如果URI指向乔Doe的用户资源也没关系是:

http://example.com/users/joedoe 

或者:

http://example.com/users?username=joedoe 

或者:

http://example.com/jif892mfd02-18f2 

或者甚至:

ftp://example.com/users/joedoe.json 

没关系! URI在RESTful应用程序中不需要有任何意义。人们花了很多时间为他们的REST应用程序设计有意义的URI,而他们应该关心他们的媒体类型。当你点击网页上的链接时,你不关心URI的语义,你只关心标签。使用REST API的客户端也会发生同样的情况。您的媒体类型的文档应该通过标签描述哪些链接可用以及他们做了什么,并且您只需遵循它们。

如果您关心的是URI的语义,这表示您的客户正在从文档中的某个模板构建URI,并且您没有使用HATEOAS,这意味着您根本没有使用REST 。

+0

但是,当你是一个开发人员必须与该API集成并使用它时,它确实会帮助你设计一个设计良好并遵循现有约定的开发人员。此外,有些人有时必须手动输入网址,因此有一个易于阅读的网址可以提高读取或转换率。那些没有?和=对于人类来说更容易,至少对于那些超级天才来说,并不是超级天才。 :D – jmort253 2013-11-02 19:03:31

+0

没有。如果您是与RESTful API集成的开发人员,那么您将遵循随资源提供的URI。如果你做得对,你可能永远不需要直接处理URI而不是将它存储在变量中,然后使用变量。如果该服务要求您从文档中给出的模板构建URI,那么它不是RESTful,就像那样简单。 – 2013-11-02 19:11:20

+0

当然,这并不意味着你不应该对你的URI进行一些思考。它只是意味着遵循约定X或Y的URI不会使您的API或多或少具有REST风格。什么让您的API RESTful是您向客户提供URI的方式。 – 2013-11-02 19:13:02