我开发了一个非常快速和简单的PHP应用程序从一个XML文件中读取分类广告和允许用户对其执行CRUD操作(这是一个家庭作业)。
现在我负责制定该应用程序RESTful服务。 这位教授实际上似乎并没有与RESTful服务的经验,因为他说我的申请被发现手在为下一个任务,当我的研究表明,它并没有真正满足所有的REST风格的要求。
无论如何,我要为学习目的正确地做到这一点,即使我可以用手在我的旧任务,并获得好成绩。 我无法学习从哪里开始,虽然; 我不知道到底是什么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>
我还使用了路德行动URL参数。 我听说过的URL参数不允许呢?
谢谢。
编辑:那么switch语句,它走在index.php文件? 然后每一种情况下将调用的函数,即CreateXML为POST方法? 然后,这些参数需要将对象类型,对象ID和内容类型? 如何获取的值来更新,我只是将它发送到包含的输入框列表中Create.php文件的XML?
如果您的服务支持所有的CRUD操作,它总是建议您实现一个RESTful接口。 这不是超硬这样做。 我列出以下一些基本知识。
RESTful服务简单地做了几件事情:
- 它使用HTTP请求方法为CRUD动作的通信
- 它使用HTTP状态代码进行通信响应状态,和
- 它使用URI来定义你的资源(文件,数据库项目你所访问,等等)。
- 它是无状态
我们的想法是,以尽量减少自定义通信的发展对于在HTTP规范已经定义了这些东西。
1 -请求方法
你是为RESTful服务支持所需的4 HTTP请求的方法有:
- POST
- 得到
- 放
- 删除
并且您可以选择支持
- 补丁
- 头
可以按如下方式直接映射这些你CRUD操作:
- POST =创建
- GET =检索
- PUT更新=
- DELETE =删除
- PATCH =编辑(部分更新,例如“密码变更”。PUT变为“替换”)
- HEAD =报头只(关于资源的元数据)
为了用一个简单的请求方法路由器正确做到这一点,路由请求如下:
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状态代码:
- 20X =成功
- 30X =重定向
- 40X =沟通问题
- 50X =服务器错误
要做到这一点,只是前面加上合适的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
您可以实现使用Apache上述约定一个非常基本的RESTful路由器mod_rewrite
在.htaccess
文件,内容如下:
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 -无国籍简单地说,服务器为客户端维护无“状态”。 用于存储会话或状态没有任何要求。 每个请求都代表一个完整的交易。 也就是说,如果我得到用户/ 1,服务器不会记得我这样做,以及未来申请将不依赖于或受以前的。
如果实施这些标准,恭喜,你已经建立了一个RESTful服务!
“REST风格”是一个广泛的概念,并有度的“RESTfulness”。 维基百科是这里的好向导
以下是对方的回答(这也是不错的)没有针对某些更高级别的特点:
- 资源是可以通过URL,优选每资源只有一个规范的网址。
- 您可以指示资源可在使用其他网址或申述
Content-Location
标头。 - 您可以使用内容协商与提供资源(HTML,JSON,XML等)的不同表示
Accept
和content-type
头。
- 在资源状态的变化完全由单个HTTP请求来表示。 服务器并不需要保持状态,以服务的客户端请求。 因此,请求可以很容易地代理和缓存。
- 常见的违反这个原则的一个例子是像“http://example.org/profile”取决于谁是登录,供应不同的用户配置文件的URL。
- 更好的方式是从授权的资源分开:“http://example.org/profile/{USERID}”将始终服务于特定用户的用户ID,但返回401(未授权)如果客户端没有权限。 (另外,授权信息应当与每一个请求一起发送,从而使服务器不需要会话令牌或类似的服务器端的状态。因此,大多数网站使用基于cookie的登录系统并不是纯粹的宁静。)
- GET检索资源。 这不应该改变资源的状态,应该是安全的重复。 此属性通常被称为“幂等”。
- PUT更新资源。 使用的技术,如条件更新需求 (PUT或DELETE的
if-*
头),你甚至可以实现乐观并发控制。 - DELETE删除资源。
- POST作为一个包罗万象的“有所作为”的资源。 当你必须做一些不干净放入HTTP方法或当您需要执行具有副作用的动作后使用(例如,不知道它的名字创建一个新的资源或实现RPC协议。)但是,您预计将使用HTTP头和响应代码显示什么资源的副作用有,例如“201创建”与
Location
和Content-Location
标头和受变化的URL列表。
- 资源表示是自描述的“超文本”与其他资源的链接。
- 违反这一原则的一个例子:假设“http://example.com/articles”是文章的列表和它的JSON表示看起来像
[1,2,3,4,5,6]
这是文章ID的列表,但它不是自我描述或超 - 客户需要知道这是文章ID的列表,它需要知道,要获得它必须构建一个网址的文章资源,如“ http://example.org/articles/1" 。 - 更好的方式是一样的响应
{"articles":[{"id":1,"url":"http://example.org/articles/1"},...]}
如HTML,使用REST服务客户端应该只需要跟随链接(不使链接),以获得其他相关资源。 你甚至可以记录可用的方法,你可以用它来操作的资源 - 创建,修改,删除等。