php - restful 是仅适用于 Web 服务还是同时适用于 Web 服务和网页?

标签 php rest restful-url

我阅读了很多关于 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 从数据库中删除。

之后我将在没有任何参数的情况下重定向回 l​​ist.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)
  • 删除(删除)

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

此外,您永远不应使用 GET 进行任何破坏性操作。任何更改资源状态的操作都应使用 POSTPUTDELETE 调用,具体取决于更改 (如果需要,使用 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/

相关文章:

javascript - 在没有引荐来源网址的情况下,Google、Facebook 等如何找出您来自哪个网站?

php - Paypal 沙盒 API 内部错误

java - REST API 中查询参数可以是强制的吗

c# - 即时生成或更新 OperationContract

wcf - 唯一证书认证和REST服务

javascript - 如何在 Vue 中将 API 应用程序 key 作为 prop 传递

java - 将一台机器迁移到另一台机器时,Post 方法不起作用

php - 如何在 smarty 中将 float 转换为 int

php - 如何将动态 php 代码插入从 MYSQL 检索的文章中?

java - 在 Spring restTemplate 中超出 START_ARRAY token