用PHP创建RESTful API?

use*_*523 7 php xml rest

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

我现在的任务是将此应用程序开发为RESTful服务.教授实际上似乎没有任何RESTful服务经验,因为他说我的应用程序可以用于下一个任务,当时我的研究表明它并没有真正满足所有RESTful要求.

无论如何,我想为学习目的正确地做这件事,即使我可以交出我的旧任务并获得好成绩.我在学习从哪里开始时遇到了麻烦; 我不确定RESTful服务究竟是什么.

我认为获得建议的最佳方式是发布我之前作业中的示例代码,以了解我如何处理事情以及我需要如何处理事情.

例如,以下是我创建新分类的方法.

Create.php

//Basically just a list of <INPUT TYPE = "text" NAME = "something"> in the <body> fields
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

我也在使用URL参数进行RUD操作.我听说过URL参数也不允许?

谢谢.

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

Ste*_*ley 15

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

RESTful服务只是做了一些事情:

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

我们的想法是尽量减少已经在HTTP规范中定义的这些东西的自定义通信的开发.


1 - 请求方法

您需要为RESTful服务支持的4种HTTP请求方法是:

  1. POST
  2. 得到
  3. 删除

你可以选择支持

  1. 补丁

您可以将这些直接映射到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;
}
Run Code Online (Sandbox Code Playgroud)

2 - 状态代码 您应该从服务中进一步实现HTTP状态代码,以将状态传回客户端,例如:

  • 20x =成功
  • 30x =重定向
  • 40x =沟通问题
  • 50x =服务器错误

为此,只需使用正确的HTTP标头输出预先添加响应,例如:

header("Status: 500 Internal Server Error");
Run Code Online (Sandbox Code Playgroud)

您可以在此处参考已实施的HTTP状态代码的完整列表:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html


3 - URI 对于URI,RESTful服务通常遵循自上而下的分类命名方法,例如

/object_type/id.content_type
Run Code Online (Sandbox Code Playgroud)

例子:

POST /user
PUT /user/1
GET /user/1.json
GET /user/1.html
Run Code Online (Sandbox Code Playgroud)

您可以mod_rewrite.htaccess文件中使用Apache实现上述约定的非常基本的RESTful路由器,如下所示:

RewriteEngine On
RewriteRule ^([^\/]+)\/([^\.]+)\.(\w+)$  index.php?object_type=$1&object_id=$2&content_type=$3
Run Code Online (Sandbox Code Playgroud)

然后,您将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
Run Code Online (Sandbox Code Playgroud)

4 - STATELESSNESS 简单地说,服务器不为客户端维护"状态".没有存储会话或状态的要求.每个请求代表一个完整的事务.即如果我获得用户/ 1,服务器将不记得我这样做了,未来的请求将不依赖于或受以前的请求影响.

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