用PHP创建RESTful API?

时间:2012-12-01 18:55:23

标签: php xml rest

我开发了一个非常快速和简单的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文件?

2 个答案:

答案 0 :(得分:15)

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

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

  1. 它使用HTTP请求方法进行CRUD操作的通信
  2. 它使用HTTP状态代码来传达响应状态,
  3. 它使用URI来定义您的资源(您正在访问的文件,数据库项等)。
  4. 无国籍
  5. 我们的想法是尽量减少已经在HTTP规范中定义的自定义通信的开发。


    1 - 请求方法

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

    1. POST
    2. GET
    3. PUT
    4. DELETE
    5. 您可以选择支持

      1. PATCH
      2. HEAD
      3. 您可以将这些直接映射到您的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
        

        您可以在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是一个很好的指南

以下是其他答案中未提及的一些更高级别的特征(也很好):

  1. 资源在URL上可用,最好每个资源只有一个规范URL。
    • 您可以使用Content-Location标题指明其他网址或表示中的资源可用。
    • 您可以通过与Acceptcontent-type标头进行内容协商,提供资源(html,json,xml等)的不同表示
  2. 资源状态的变化完全由单个HTTP请求表示。服务器不需要维护状态来为客户端请求提供服务。因此,可以轻松地代理和缓存请求。
    • 此原则的常见违规的示例是“http://example.org/profile”之类的网址,根据登录的人员提供不同的用户个人资料。
    • 更好的方法是将资源与授权分开:“http://example.org/profile/{USERID}”将始终为特定用户的用户ID提供服务,但如果客户端没有权限,则返回401(未授权) 。 (此外,授权信息应与每个请求一起发送,以便服务器不需要会话令牌或类似的服务器端状态。因此,大多数具有基于cookie的登录系统的网站纯粹是宁静的。)
    • 获取资源以获取资源。这不应该改变资源的状态,应该可以安全地重复。这个属性通常被称为“Idempotency”。
    • PUT更新资源。使用conditional updating requests(带有if-*标头的PUT或DELETE)等技术,您甚至可以实现乐观并发控制。
    • 删除以删除资源。
    • 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一样,使用休息服务的客户端只需要关注链接(而不是 make 链接)来获取其他相关资源。您甚至可以记录可用于操作资源的可用方法 - 创建,更新,删除等。