Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中创建RESTful API?_Php_Xml_Rest - Fatal编程技术网

在PHP中创建RESTful API?

在PHP中创建RESTful API?,php,xml,rest,Php,Xml,Rest,我开发了一个非常快速简单的PHP应用程序,用于从XML文件中读取分类广告,并允许用户对其执行CRUD操作(这是一个家庭作业) 我现在的任务是将这个应用程序开发成RESTful服务。这位教授实际上似乎对RESTful服务没有任何经验,因为他说我的应用程序被发现可以提交给下一个作业,而我的研究表明它并没有真正满足所有RESTful要求 不管怎样,为了学习的目的,我想正确地做这件事,即使我能交上我的旧作业并获得好成绩。但是我在学习从哪里开始时遇到了困难;我不确定RESTful服务到底是什么 我认为获得

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

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

不管怎样,为了学习的目的,我想正确地做这件事,即使我能交上我的旧作业并获得好成绩。但是我在学习从哪里开始时遇到了困难;我不确定RESTful服务到底是什么

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

例如,下面是我如何创建新的分类广告

Create.php

//Basically just a list of <INPUT TYPE = "text" NAME = "something"> in the <body> fields
<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>
//基本上只是字段中的一个列表
CreateSuccess.php

//Basically just a list of <INPUT TYPE = "text" NAME = "something"> in the <body> fields
<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>
addChild(“广告”),“”;
$newAd->addAttribute('category',$_POST[“category]”);
$title=$newAd->addChild('title',$_POST[“title”]);
$title->addAttribute('ID',$_POST[“ID]”);
$pageTitle=$newAd->addChild('pageTitle',$_POST[“pageTitle]”);
//等,用于所有提交框
//保存XML
$simplerXML->asXML('file.xml');
回声“
//重定向回广告列表页面
window.onload=function(){top.location.href='ads.php';};
";
?>
我还在RUD操作中使用URL参数。我听说URL参数也不被允许

谢谢

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

如果您的服务支持所有CRUD操作,建议始终实现RESTful接口。这样做并不特别难。我在下面概述了一些基本知识

RESTful服务只需做几件事:

  • 它使用HTTP请求方法进行CRUD操作的通信
  • 它使用HTTP状态代码来传递响应状态,以及
  • 它使用URI来定义您的资源(您正在访问的文件、数据库项等)
  • 它是无国籍的
  • 这样做的目的是最大限度地减少为这些已经在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;
    }
    
    RewriteEngine On
    RewriteRule ^([^\/]+)\/([^\.]+)\.(\w+)$  index.php?object_type=$1&object_id=$2&content_type=$3
    
    • POST=创建
    • 获取=检索
    • PUT=更新
    • 删除=删除
    • 补丁=编辑(部分更新,例如“更改密码”。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;
    }
    
    RewriteEngine On
    RewriteRule ^([^\/]+)\/([^\.]+)\.(\w+)$  index.php?object_type=$1&object_id=$2&content_type=$3
    

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

    • 20x=成功
    • 30x=重定向
    • 40x=通信问题
    • 50x=服务器错误
    要做到这一点,只需在响应前添加适当的HTTP头输出,例如:

    header("Status: 500 Internal Server Error");
    
    您可以在此处参考已实现HTTP状态代码的完整列表:


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

    /object_type/id.content_type
    
    示例:

    POST /user
    PUT /user/1
    GET /user/1.json
    GET /user/1.html
    
    您可以在
    .htaccess
    文件中使用Apache with
    mod_rewrite
    为上述约定实现一个非常基本的RESTful路由器,如下所示:

    switch ($_SERVER["REQUEST_METHOD"]) {
        case "POST":
            // Create action
            break;
        case "GET":
            // Retrieve action
            break;
        case "PUT":
            // Update action
            break;
        case "DELETE":
            // Delete action
            break;
    }
    
    RewriteEngine On
    RewriteRule ^([^\/]+)\/([^\.]+)\.(\w+)$  index.php?object_type=$1&object_id=$2&content_type=$3
    
    然后让
    index.php
    查找适当的对象类型和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-无国籍状态 简单地说,服务器不维护客户端的“状态”。不需要存储会话或状态。每个请求代表一个完整的事务。也就是说,如果我得到user/1,服务器将不会记得我做了那件事,未来的请求将不会依赖于或受以前的请求影响

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

    “宁静”是一个宽泛的概念,有不同程度的“宁静”。他是这里的好向导

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

  • 资源在url上可用,最好每个资源只有一个规范url。
    • 您可以使用
      内容位置
      标题指示资源在其他URL或表示中可用
    • 通过使用
      Accept
      content-type
      标题的内容协商,可以提供资源的不同表示形式(html、json、xml等)
  • 资源状态的更改完全由单个HTTP请求表示。服务器不需要维护状态来为客户端请求提供服务。因此,可以轻松地代理和缓存请求。
    • 一个常见的违反这一原则的例子是类似“url”的urlhttp://example.org/profile“根据登录用户的不同,它提供不同的用户配置文件
    • 最好将资源与授权分开:http://example.org/profile/{USERID}“将始终提供特定用户的USERID,但如果客户端没有权限,则返回401(未授权)。(此外,授权信息应随每个requ一起发送