5

我阅读了很多关于 PHP 的 Restful 教程。

(我不想深入探讨为什么我不使用 RoR。这是由于团队更熟悉 PHP)

因为我们正在计划未来扩展到拥有 API,所以我读到实现 Restful Web 服务很重要。

我看过教程,例如

http://www.gen-x-design.com/archives/create-a-rest-api-with-php/

显然,restful 是用于 web 服务的。

网页呢?他们也可以安静吗?

如果答案是否定的,请不要超出这条线并告诉我。谢谢你。

我知道让 url 看起来像 RESTFUL url 就是简单地使用 mod_rewrite。然而,我很确定,宁静的架构不仅仅是让 url 看起来不错。

例如,我在名为 list.php 的网页上有一个项目列表。每个项目旁边都有一个删除链接。例如,list.php?id=1&deleteitem

当有人点击 list.php?id=1&deleteitem 链接时会发生什么,当然我会回到同一个 list.php 文件并检查 $_GET 中的参数 deleteitem。

如果检测到,我将根据 $_GET 中的参数 ID 从数据库中删除。

之后,我将在没有任何参数的情况下重定向回 l​​ist.php。

我想知道,我如何让整个流程变得 RESTFUL?

我问是因为在 REST 中,要删除您需要使用 HTTP 请求方法 (DELETE) 的内容。

显然,在我的链接中,它们都只是简单的<a href="list.php?id=1&deleteitem">Delete</a>

请赐教。

我的编程不是那么强大,如果给出的建议可以尽可能外行,那就太好了。

谢谢你。

编辑

我有 2 个后续问题。

问题 1) 由于这是一个带有分页的项目列表,如果我想让它成为 RESTful,该 URL 会是什么样子?

问题2)由于我将删除链接放在列表中的每个项目旁边,我现在明白了,我应该使用

<form method="POST">
<input type=hidden name="_method" value="delete">
<input type="submit" >
</form>

反而。

但是表格应该张贴到哪里?项目网址?/items/{item-id}

但我想在成功删除数据库中的行后返回此列表页面,显示成功消息。

当我用成功消息刷新此列表页面时,我还想避免弹出消息。

如果我发回这个 list.php 网址,那么它不是 RESTful 是吗?因为下面的答案告诉我,每个项目都是需要自己的 url 的资源。

请赐教。谢谢你。

4

5 回答 5

6

RESTful 在提到 Web 服务时通常使用,但它可以很好地应用于网页。简而言之,RESTful 就是处理资源。资源可以是一个人、一本书、一部电影、一个剧院、一张票,或者任何你喜欢的东西。

您可以对资源执行四种基本操作。

  • 创建(发布)
  • 读取(获取)
  • 更新(放置)
  • 删除(删除)

大多数 Web 浏览器不支持PUTandDELETE操作,因此您只能使用 POST 操作来发送数据。Rails 通过传入一个名为_method该框架的隐藏参数来伪造 PUT 和 DELETE,并根据该值对其进行路由。

此外,您绝不应将GET其用于任何破坏性行为。任何更改资源状态的操作都应使用 、 或根据更改调用POSTPUT如果DELETE需要,使用 POST 伪造 PUT/DELETE)。

我建议您检查一下 Rails 中处理 RESTful 路由的方式,只是为了了解一下,如果没有别的。尽管上面的四个动作足以以任何可能的方式修改资源,Rails 还引入了其他三种听起来很有用的动作。

  • 索引(所有项目的列表视图)
  • 新的(通常是添加新资源的表单视图)
  • 编辑(通常是更新现有资源的表单视图)

在设计 RESTful 网站时,漂亮的 URL 肯定是摆在桌面上的,但最大的胜利可能是代码的质量会自动提高。如果您只处理资源,并且只有四种可能的操作可以应用于资源,那么事情就会开始自行清理。

编辑 1:首选自描述 URL,这将使您的生活更轻松,但没有什么可以阻止创建唯一标识资源并使用 HTTP 动词管理它的神秘 URL。以下 URL(使用 md5)来唯一标识资源是完全 RESTful 的。

// represents a person "John Doe"
http://example.com/4c2a904bafba06591225113ad17b5cec

// represents the movie "Lord of the Rings: The Two Towers"
http://example.com/1d9198260dec7bda3fb21e232d60fec3

// represents the "Formula One" sport
http://example.com/fs340as?id=23xa12&type=SP012Ts

这就是代表性状态转移。MD5 散列就像是保持不变的资源的邮寄地址。表示可能是电影的详细信息(在 html/xml/json/等中),或者可能是电影本身的视频,具体取决于客户端的功能)。

编辑2:假设您有一个资源,它是countries世界的集合。它可以由 URI 和 HTTP 动词表示,例如:

GET /countries

由于分页是应用程序的属性而不是资源本身,因此您可以提供查询字符串参数来控制它。

GET /countries?page=1

一个国家也是一种资源,它是国家资源的一部分。您可以使用以下 URL 来识别国家/地区:

/countries/<id>

对这个国家的操作可以用这些动词来执行:

GET    /countries/<id>
POST   /countries  -- the new country has no existing representation
PUT    /countries/<id>
DELETE /countries/<id>
于 2010-03-06T08:27:03.293 回答
2

长答案短:是的。REST 适用于两者。那是因为即使您拥有所有网站中最简单的网站,您仍然需要获取您的页面并可能发布个人数据才能将条目添加到留言簿。我们都以某种方式坚持 REST。

在您的情况下,糟糕的浏览器实现使得很难实现 PURE RESTful 方式。如果没有 Javascript,则不支持 DELETE,因此无论如何您都必须使用 GET 或 POST(两者的含义与 REST 中的 DELETE 完全不同)。

于 2010-03-06T08:17:55.103 回答
1

Restful 方法当然也可以在网页中使用。由于您提到的副作用,将命令放入 URL 不是一个好主意。当您更改数据库(或执行任何更改模型的操作)时,请使用 POST 命令。

当然,您在主流网络浏览器中没有 PUT 和 DELTE,但您始终可以发送带有一些特定参数的简单 POST,例如method= "PUT"、method="DELETE" 等。

于 2010-03-06T08:17:28.527 回答
1

我在 Zend Framework 之上编写了一个小型框架,以更轻松地实现 RESTful 接口:

http://github.com/mikekelly/Resauce

您可以将其用于 Web 服务和网站。本质上,网站只是由 HTML 驱动的 Web 服务。

于 2010-03-06T09:13:37.117 回答
1

RESTful 意味着不是“漂亮的 URI”。尽管 URI 标识了资源,但 REST 关于 URI 的唯一说法是,它们不应该包含像“删除”这样的操作参数。

在你的情况下,你会打电话

DELETE /items/6793

答案通常是状态代码200 OK,修改后的列表作为消息正文。请参阅:http ://restpatterns.org/HTTP_Methods/DELETE

由于 HTML 4 不支持除 GET 和 POST 之外的其他表单操作,因此您必须使用隐藏参数解决方法并覆盖服务器端的 HTTP 方法。

于 2010-03-06T09:28:24.950 回答