在PHP中创建一个RESTful API?(Create a RESTful API in PHP?

2019-08-03 10:10发布

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

Answer 1:

如果您的服务支持所有的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;
}

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服务!



Answer 2:

“REST风格”是一个广泛的概念,并有度的“RESTfulness”。 维基百科是这里的好向导

以下是对方的回答(这也是不错的)没有针对某些更高级别的特点:

  1. 资源是可以通过URL,优选每资源只有一个规范的网址。
    • 您可以指示资源可在使用其他网址或申述Content-Location标头。
    • 您可以使用内容协商与提供资源(HTML,JSON,XML等)的不同表示 Acceptcontent-type头。
  2. 在资源状态的变化完全由单个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创建”与LocationContent-Location标头和受变化的URL列表。
  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,使用REST服务客户端应该只需要跟随链接(不使链接),以获得其他相关资源。 你甚至可以记录可用的方法,你可以用它来操作的资源 - 创建,修改,删除等。


文章来源: Create a RESTful API in PHP?
标签: php xml rest