RESTful流程?

时间:2009-06-19 03:45:17

标签: php rest

因此...

我一直在阅读REST一点点,其背后的想法听起来不错,但问题是,它是否可以轻松地集成到网页的标准流程中?

例如,用户创建某种项目,博客文章或您拥有的内容,现在他想删除它,因此他点击页面上的“删除”链接。怎么办?我们如何向http://mysite.com/posts/5发出DELETE请求?我们如何处理这个请求?我对cURL或其他任何东西都没有经验,但从它的外观来看,我必须curl_init('http://mysite.com/posts/5')然后再做一些魔术。但是我甚至会把那个剧本放在哪里?那必须在另一个页面上,这将打破REST的整个想法。那么我只会GET另一个页面,而这个页面又会DELETE我最初想要的页面?

这就是为什么人们很少使用REST或实际上是否有一个很好的方法来做到这一点?


看起来我需要澄清一下。人们建议我在URL中加入“DELETE”和“POST”等字样。我相信REST规定我们为每个资源都有一个唯一的URL,但对于该资源上的每个操作都而不是。我认为这也意味着我们每个资源只有一个一个 URL。即我希望能够从一个 URL(通过发送DELETE,PUT,POST或GET)删除或查看特定帖子的内容,而不是使用其他参数的不同URL

8 个答案:

答案 0 :(得分:6)

使用一个安静的服务器,相同的网址(比如/ books / 1)可以响应许多不同的动词。这些动词,GET,POST,PUT和DELETE以及路径指示您要对服务器上的数据执行的操作。回复会告诉您答案。

REST是以可预测和合理的方式访问数据。

如果你来自一个强大的PHP背景,每个网址必须映射到一个特定的文件,你是对的,它没有多大意义。两个最明显的RESTful开发环境,ASP.NET MVC和Rails,每个都有特殊的服务器(或服务器逻辑),它们读取动词并为您执行特殊的路由。这就是让应用程序的“正常流程”按照您的预期通过的原因。对于PHP,有一些框架可以帮助解决这个问题,例如WSO2's WSF

REST如何与Web浏览器一起使用

举个例子,举个例子。我们有帖子,我们想删除一个。

  1. 我们首先访问/ posts / 4之类的网址。正如我们所期望的那样,这显示了帖子4,它的属性以及你可以采取的一些行动。呈现此网址的请求看起来像GET /posts/4。响应包含描述该项目的HTML。

  2. 用户点击“删除项目4”链接,这是HTML的一部分。这会向服务器发送DELETE /posts/4之类的请求。请注意,这已重新使用/posts/4网址,但逻辑必须不同。

    在HTML表单和Web浏览器中,默认情况下,其中许多将使用method =“delete”将链接更改为method =“post”链接。您需要使用Javascript(类似this)来更改动词。 Ruby on Rails使用隐藏的输入字段(_method)来指示在表单上使用哪种方法,作为替代方法。

  3. 在服务器端,执行“删除项目”逻辑。它知道执行此操作是因为请求中的动词(DELETE)与正在执行的动作相匹配。这是REST的关键点,HTTP动词变得有意义。

  4. 删除该项目后,您可以回复“yep,done”或“no,抱歉,你不能这样做”这样的页面,但对于浏览器来说,把你放到某个地方更有意义其他。正在删除的项目,通过重定向到GET /posts进行回复很有意义。

  5. 如果查看服务器日志,很清楚每个人对服务器做了什么,但这并不像...那么重要。

    REST如何使用任意数据

    REST的另一个关键点是它适用于多种数据格式。假设您正在编写一个程序,希望以编程方式阅读和与博客交互。您可能希望以XML格式提供所有帖子,而不是必须抓取HTML以获取信息。

    GET /posts/4.xml很直观:“服务器,请给我xml描述帖子#4。”响应将是xml。 RESTful服务器使得如何获取所需信息显而易见。

    当你提出DELETE /posts/4.xml请求时,你会问,“服务器,请删除第4项。”像“好的,确定”这样的回答通常足以表达发生的事情。然后程序可以决定它想要什么,并提出另一个请求。

答案 1 :(得分:1)

根据您使用的框架,有一些模型可确定如何为每种资源处理操作。

基本上使用其他参数,您希望向资源发送要执行的操作。例如,该参数可以通过AJAX / JS发送。

如果你想没有 javascript / ajax(如果它已被禁用),那么表单POST方法也会起作用,向资源发送额外的ACTION参数。

当然,在这两种情况下,您都必须考虑安全性,并确保他们不会向资源发送他们不应该执行的操作。确保对后端进行检查,并发送适当的响应或错误消息。

客户端脚本,无论是通过JS / Ajax还是表单POST或其他方法,都需要额外的安全预防措施。

从海报澄清后编辑。

答案 2 :(得分:1)

一种方法是使用DELETE方法进行AJAX调用。

答案 3 :(得分:1)

我认为很少使用REST。您现在正在StackOverflow上使用它。就您的具体示例而言,您可以在支持它的浏览器中通过XMLHttpRequest发送DELETE请求。当JS关闭或不兼容的浏览器时,您可以执行以下操作:

POST http://foo.com/delete?post=5

不理想,但比许多网站更安静。

编辑:更改为POST

答案 4 :(得分:1)

Facebook的REST服务器是伪服务器,您可以像他们一样,请求post方法:POST,GET等操作以及该请求所需的其他值。

为什么我说facebook是伪REST服务器? :好吧,REST原则之一说

  
      
  • 使用通用语法在超媒体链接中使用唯一可寻址的资源
  •   

在facebook中你只有/server.php,你可以在那里发出请求,即使是(POST,GET,PUT,DELETE ......)

另一种方法是使用mod_rewrite并解析客户端请求的URL

编辑:刚刚找到this,看起来很有趣。玩得开心!

答案 5 :(得分:1)

不要过度思考它。您无法使用直接HTML表单和浏览器执行此操作。 They do not support DELETE method。 Ajax可以做到。

  

我希望能够删除到VIEW   来自的特定帖子的内容   一个URL(通过发送DELETE,   PUT,POST或GET),而不是不同的URL   附加参数

删除查看?我不确定我是否理解它,但您的删除应该通过标题完成,而不是通过URL完成。 delete方法不应返回视图。 REST是服务,并非所有请求都是为了视觉消费。

答案 6 :(得分:1)

如果您真的没有选择使用DELETE动词,那么我建议如下:

POST http://mysite.com/Trashcan?resourceUrl=/Customer/75

你使用什么网址对REST来说无关紧要,但是,如果你的网址完全避免使用动词,则更容易理解REST的交互方式。

我从Rails和ASP.NET MVC用户那里看到了很多问题,他们需要超越标准的“操作”,并且很容易在控制器上添加新操作。这样做的问题是你只是抛弃了REST的统一接口约束。

垃圾桶隐喻并不是唯一可以进行删除的方法,但我认为在网址中添加“删除”就像读取一样清楚。

以下是一些更换动词的“基于名词的”方法。

POST http://mysite.com/Printer/75/PrintQueue?url=http://mysite.com/Document/xyz
POST http://mysite.com/CurrentLogins?user=bob
POST http://mysite.com/QueryProcessor?query=FindMyInformation
POST http://mysite.com/SearchEngine?searchTerms=cat,blue,furry
POST http://mysite.com/OrderProcessor?cart=http://mysite.com/user/2323/cart

有时你必须开箱即用,想出一个基于名词的网址,并且尝试这样做可能看起来很迂腐,但对我而言,好处来自于管理变量的能力。我将在我的界面中拥有可变数量的资源,无论我做什么,如果我可以修复可以对这些资源进行操作的动词的数量,那么我会减少我的一个变量。

答案 7 :(得分:0)

另一种方法,假设基于webbased / webapplication的请求,有2个提交按钮。由于PUT和DELETE使用相同的uri / url。您可以添加特定的删除表单并将特定名称附加到此删除按钮,因此当通过帖子发送时,您可以使用此按钮名称将操作转换为DELETE