2012-12-01 56 views
7

我开发了一个非常快速和简单的PHP应用程序,用于从XML文件读取分类广告并允许用户对其执行CRUD操作(这是一项家庭作业)。在PHP中创建一个RESTful API?

我现在的任务是将此应用程序开发为RESTful服务。这位教授实际上对RESTful服务似乎没有任何经验,因为他说我的应用程序被发现要交给下一个任务,当时我的研究表明它没有真正满足所有RESTful需求。

无论如何,为了学习的目的,我想正确地做到这一点,即使我可以交出旧作业并获得好成绩。尽管如此,我仍然无法学习。我不确定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参数。我听说网址参数也不被允许?

谢谢。

编辑: 所以SWITCH语句,它是否在index.php文件?然后每个案例都会调用一个函数,例如用于POST方法的CreateXML? 然后它需要的参数是对象类型,对象id和内容类型?如何获取更新XML的值,我只是将它发送到包含输入框列表的Create.php文件?

+0

关于你提到的其他问题:是的,你可以把'之开关在你的指数。 php,或者如果你想进入更复杂的架构,你可以引导一个处理路由的外部路由器组件。 URI解析仅供参考 - 我认为您不需要它为您的应用程序。鉴于您的应用程序的简单性,您可以解析并路由请求方法以编辑您的单个文件。这仍然是RESTful。 –

+1

更一般地说,RESTfulness关注*接口*,而不是*实现*。 –

回答

15

如果您的服务支持所有CRUD操作,则始终建议实施RESTful界面。这样做并不难。我已经概述了下面的一些基础知识。

RESTful服务简单地做几件事情:

  1. 它使用HTTP请求方法为CRUD动作的通信
  2. 它使用HTTP状态代码进行通信响应状态,和
  3. 它使用URI来定义您的资源(您正在访问的文件,数据库项目等)。
  4. 它是无状态的

的想法是,以尽量减少自定义通信的发展对于在HTTP规范已经定义了这些东西。


1 - 请求方法

4 HTTP请求你需要为RESTful服务支持的方法有:

  1. POST
  2. GET
  3. PUT
  4. DELETE

,你可以有选择地支持

  1. PATCH
  2. HEAD

如下您可以直接映射这些到您的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 

您可以实现在一个.htaccess文件使用Apache与mod_rewrite上述惯例,一个非常基本的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 - 无国籍 简单地说,服务器维护无 “状态” 的客户端。无需存储会话或状态。每个请求都代表完整的交易。即如果我GET用户/ 1,服务器不会记得我做到了,未来的请求不会依赖于或受到以前的影响。

如果您实施这些标准,恭喜,您已经构建了一个RESTful服务!

+0

很好的答案,恭喜! – m4t1t0

+0

非常感谢您的详细解答。我可以看到你已经编辑了很多,你花的时间非常感谢。如果你可以看看,我还有几个我已经编辑过的澄清问题。 – user1287523

+0

很抱歉重启,但不应该将POST/user/1.xml设置为POST/user?如果不是,我们怎么知道这个数字?谢谢。 – JorgeeFG

4

“RESTful”是一个广泛的概念,并有“RESTfulness”程度。 Wikipedia是一个很好的指南这里

以下是对方的回答不是解决了一些更高级别的特性(这也很好):

  1. 资源可在网址,优选每资源只有一个规范的网址。
    • 您可以使用Content-Location标题指示资源在其他网址或表示形式中可用。
    • 通过使用与Acceptcontent-type标头的内容协商,您可以提供资源(html,json,xml等)的不同表示
  2. 资源状态的变化完全由单个HTTP请求表示。服务器不需要维护状态来处理客户端请求。因此,请求可以很容易代理和缓存。
    • 共同违反这一原则的一个例子是像“http://example.org/profile”的URL取决于谁在登录该服务于不同的用户配置文件。
    • 更好的将将资源与授权分开:“http://example.org/profile/{USERID}”将始终为特定用户的用户ID提供服务,但如果客户端没有权限,则返回401(未授权)。 (此外,授权信息应该随每个请求一起发送,以便服务器不需要会话令牌或类似的服务器端状态。因此,大多数具有基于cookie的登录系统的网站是纯粹宁静的而不是。)
    • GET检索资源。这不应该改变资源的状态,应该是安全可重复的。这个属性通常被称为“幂等性”。
    • PUT更新资源。通过使用诸如conditional updating requests(PUT或DELETE和if-*标头)等技术,您甚至可以实施乐观并发控制。
    • 删除删除资源。
    • POST作为一种“做某事”的资源。当您必须做一些不适合干净地放入http方法或需要执行具有副作用的操作时(例如,在不知道名称或实现RPC协议的情况下创建新资源),将使用POST。但是,您需要使用http标题和响应代码来显示那些资源的副作用,例如带有LocationContent-Location标题的“201 Created”,以及受更改影响的网址列表。
  3. 资源表示是自描述的“超文本”,包含指向其他资源的链接。
    • 一个违反这个原则的一个例子:假设“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一样,使用休息服务的客户端应该只需要关注链接(而不是使链接)以获取其他相关资源。你甚至可以记录可用的方法,你可以用它来操作的资源 - 创建,更新,删除等