我开发了一个非常快速和简单的PHP应用程序,用于从XML文件中读取分类广告,并允许用户对其执行CRUD操作(这是一项家庭作业)。
我现在的任务是将此应用程序开发为RESTful服务。教授实际上似乎没有任何RESTful服务经验,因为他说我的应用程序可以用于下一个任务,当时我的研究表明它并没有真正满足所有RESTful要求。 / p>
无论如何,我想为学习目的正确地做这件事,即使我可以交出我的旧任务并获得好成绩。我在学习从哪里开始时遇到了麻烦;我不确定RESTful服务究竟是什么。
我认为获得建议的最佳方式是发布我之前作业中的示例代码,以了解我如何处理事情以及我需要如何处理事情。
例如,以下是我创建新分类广告的方法。
Create.php
//Basically just a list of <INPUT TYPE = "text" NAME = "something"> in the <body> fields
CreateSuccess.php
<html><head><?php $simplerXML = simplexml_load_file('file.xml');
//Generate the basic ad information
$newAd = $simplerXML->addChild('advertisement','');
$newAd->addAttribute('category', $_POST["category"]);
$title = $newAd->addChild('title', $_POST["title"]);
$title->addAttribute('ID', $_POST["ID"]);
$pageTitle = $newAd->addChild('pagetitle', $_POST["pagetitle"]);
//etc, for all the SUBMIT boxes
//save the XML
$simplerXML->asXML('file.xml');
echo "<script type='text/javascript'>
//redirect back to ad listing page
window.onload = function () { top.location.href = 'ads.php'; };
</script>";
?></head>
<body></body></html>
我还使用RND操作的URL参数。我也不允许听到网址参数?
感谢。
编辑: 那么SWITCH语句是否会进入index.php文件?然后每个案例都会调用一个函数,即POST方法的CreateXML? 那么它需要的参数是对象类型,对象ID和内容类型?如何获取更新XML的值,是否只将其发送到包含输入框列表的Create.php文件?
答案 0 :(得分:15)
如果您的服务支持所有CRUD操作,则始终建议实施RESTful接口。这样做并不是很难。我已经概述了下面的一些基础知识。
RESTful服务只是做了一些事情:
我们的想法是尽量减少已经在HTTP规范中定义的自定义通信的开发。
1 - 请求方法
您需要支持RESTful服务的4种HTTP请求方法是:
您可以选择支持
您可以将这些直接映射到您的CRUD操作,如下所示:
为此,请使用简单的请求方法路由器正确路由请求,如下所示:
switch ($_SERVER["REQUEST_METHOD"]) {
case "POST":
// Create action
break;
case "GET":
// Retrieve action
break;
case "PUT":
// Update action
break;
case "DELETE":
// Delete action
break;
}
2 - 状态代码 您应该进一步从服务中实现HTTP状态代码,以将状态通信回客户端,例如:
为此,只需使用正确的HTTP标头输出预先添加响应,例如:
header("Status: 500 Internal Server Error");
您可以在此处参考已实施的HTTP状态代码的完整列表:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
3 - URI 对于URI,RESTful服务通常遵循自上而下的分类命名方法,例如
/object_type/id.content_type
示例:
POST /user
PUT /user/1
GET /user/1.json
GET /user/1.html
您可以在mod_rewrite
文件中使用带.htaccess
的Apache实现上述约定的非常基本的RESTful路由器,如下所示:
RewriteEngine On
RewriteRule ^([^\/]+)\/([^\.]+)\.(\w+)$ index.php?object_type=$1&object_id=$2&content_type=$3
然后你会index.php
寻找合适的object_type和id来适当地路由,例如:
$object = $_GET["object_type"];
$id = (int) $_GET["object_id"];
$content_type = $_GET["content_type"];
// Route from here to a class with the name of the object (e.g. UserController) via __autoload
// or to a file (e.g. user.php) via include, and pass id and content_type as params
4 - STATELESSNESS 简单地说,服务器不为客户端维护“状态”。没有存储会话或状态的要求。每个请求代表一个完整的事务。即如果我获得用户/ 1,服务器将不记得我这样做了,未来的请求将不会依赖或影响以前的请求。
如果您实施这些标准,恭喜,您已经构建了RESTful服务!
答案 1 :(得分:4)
“RESTful”是一个广泛的概念,并且有一定程度的“RESTfulness”。 Wikipedia是一个很好的指南
以下是其他答案中未提及的一些更高级别的特征(也很好):
Content-Location
标题指明其他网址或表示中的资源可用。Accept
和content-type
标头进行内容协商,提供资源(html,json,xml等)的不同表示。if-*
标头的PUT或DELETE)等技术,您甚至可以实现乐观并发控制。Location
和Content-Location
标题的“201 Created”以及受此更改影响的网址列表。[1,2,3,4,5,6]
。这是一个文章ID列表,但它不是自描述或超文本 - 客户端需要知道这是一个文章ID列表,它需要知道要获得一个文章资源,它必须构建一个像“ http://example.org/articles/1" 。{"articles":[{"id":1,"url":"http://example.org/articles/1"},...]}
这样的回复。与html一样,使用休息服务的客户端只需要关注链接(而不是 make 链接)来获取其他相关资源。您甚至可以记录可用于操作资源的可用方法 - 创建,更新,删除等。