我阅读了很多关于 PHP 的 Restful 教程。
(我不想深究为什么不用RoR,是因为团队对PHP比较熟悉)
因为我们计划在未来扩展到拥有 API,所以我了解到实现 Restful Web 服务很重要。
我看过教程如
http://www.gen-x-design.com/archives/create-a-rest-api-with-php/
显然 restful 是为 web 服务设计的。
网页呢?他们也可以 RESTFUL 吗?
如果答案是否定的,请不要超出这条线并告诉我。谢谢。
我知道要使 url 看起来像 RESTFUL url 就是简单地使用 mod_rewrite。然而,我很确定,restful 架构不仅仅是让 url 看起来漂亮。
例如,我在名为 list.php 的网页上有一个项目列表。每个项目旁边都有一个删除链接。例如,list.php?id=1&deleteitem
当有人点击 list.php?id=1&deleteitem 链接时,我当然会返回同一个 list.php 文件并检查 $_GET 中的参数 deleteitem。
如果检测到,我将根据 $_GET 中的参数 ID 从数据库中删除。
之后我将在没有任何参数的情况下重定向回 list.php。
我想知道,如何让整个流程变得安静?
我问是因为在 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 url,那么它不是 RESTful 是吗?因为下面的答案告诉我每个项目都是需要自己的 url 的资源。
请赐教。谢谢。
最佳答案
RESTful 通常在提及 Web 服务时使用,但它也可以很好地应用于网页。简而言之,RESTful 就是处理资源。资源可以是一个人、一本书、一部电影、一座剧院、一张门票或任何您喜欢的东西。
您可以对资源执行四种基本操作。
- 创建(POST)
- 阅读(获取)
- 更新(PUT)
- 删除(删除)
大多数网络浏览器不支持PUT
和DELETE
操作,因此您只能使用POST 操作来发送数据。 Rails 通过传入一个名为 _method
的隐藏参数来伪造 PUT 和 DELETE,框架会根据该值选择并路由它。
此外,您永远不应使用 GET
进行任何破坏性操作。任何更改资源状态的操作都应使用 POST
、PUT
或 DELETE
调用,具体取决于更改 (如果需要,使用 POST 伪造 PUT/DELETE。
我建议您检查一下 Rails 中处理 RESTful 路由的方式,如果没有别的,只是为了了解一下。虽然上述四种操作足以以任何可能的方式修改资源,但 Rails 还引入了其他三种听起来很有用的操作类型。
- 索引(所有项目的 ListView )
- new(通常是一个表单 View 来添加一个新的 资源)
- 编辑(通常是表单 View 更新现有资源)
在设计 RESTful 网站时,漂亮的 URL 绝对是摆在桌面上的,但最大的好处可能是代码质量会自动提高。当您只处理资源,并且只有四种可能的操作可以应用于资源时,事情就会开始自行清理。
编辑 1: self 描述的 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>
关于php - restful 是仅适用于 Web 服务还是同时适用于 Web 服务和网页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2391792/