推荐阅读
  • PHP FTP

    PHP FTP 函数 PHP FTP 简介 FTP 函数通过文件传输协议 (FTP) 提供对文件服务器的客户端访问。 FTP 函数用于打开、登录以及关闭连接,同时用于上传、下载、重命名、删除及获取文件服务器上的文件信息。不是所有的 FTP 函数对每个服务器都起作用或返回相同的结果。自 PHP 3 起,FTP 函数可用。 这些函数用于对 FTP 服务器进行细致的访问。如果您仅仅需要对 FTP 服务

  • PHP Libxml

    PHP Libxml 函数 PHP Libxml 简介 Libxml 函数和常量与 SimpleXML、XSLT 以及 DOM 函数一起使用。 安装 这些函数需要 Libxml 程序包。 在 xmlsoft.org 下载 PHP Libxml 函数 PHP:指示支持该函数的最早的 PHP 版本。 函数 描述 PHP libxml_clear_errors()

  • PHP 日期

    PHP date() 函数 PHP date() 函数用于格式化时间/日期。 PHP date() 函数 PHP date() 函数可把时间戳格式化为可读性更好的日期和时间。 时间戳是一个字符序列,表示一定的事件发生的日期/时间。 语法 string date ( string $format [, int $timestamp ] ) 参数 描述 format

  • PHP MySQL Delete

    PHP MySQL Delete DELETE 语句用于从数据库表中删除行。 删除数据库中的数据 DELETE FROM 语句用于从数据库表中删除记录。 语法 DELETE FROM table_name WHERE some_column = some_value 注释:请注意 DELETE 语法中的 WHERE 子句。WHERE 子句规定了哪些记录需要删除。如果您想省去 WHERE

  • PHP MySQL 插入多条数据

    PHP MySQL 插入多条数据 使用 MySQLi 和 PDO 向 MySQL 插入多条数据 mysqli_multi_query() 函数可用来执行多条SQL语句。 以下实例向 'MyGuests' 表添加了三条新的记录: 实例 (MySQLi - 面向对象) [mycode3 type='php']..

  • PHP 包含

    PHP 包含文件 PHP include 和 require 语句 在 PHP 中,您可以在服务器执行 PHP 文件之前在该文件中插入一个文件的内容。 include 和 require 语句用于在执行流中插入写在其他文件中的有用的代码。 include 和 require 除了处理错误的方式不同之外,在其他方面都是相同的: require 生成一个致命错误(E_COMPILE_ERROR)

  • PHP 字符串

    PHP 字符串变量 字符串变量用于存储并处理文本。 PHP 中的字符串变量 字符串变量用于包含有字符的值。 在创建字符串之后,我们就可以对它进行操作了。您可以直接在函数中使用字符串,或者把它存储在变量中。 在下面的实例中,我们创建一个名为 txt 的字符串变量,并赋值为 'Hello world!' 。然后我们输出 txt 变量的值: [mycode type=&#039

  • PHP Error

    PHP 错误处理 在 PHP 中,默认的错误处理很简单。一条错误消息会被发送到浏览器,这条消息带有文件名、行号以及描述错误的消息。 PHP 错误处理 在创建脚本和 Web 应用程序时,错误处理是一个重要的部分。如果您的代码缺少错误检测编码,那么程序看上去很不专业,也为安全风险敞开了大门。 本教程介绍了 PHP 中一些最为重要的错误检测方法。 我们将为您讲解不同的错误处理方法: 简单的 &#

  • PHP echo/print

    PHP 5 echo 和 print 语句 在 PHP 中有两个基本的输出方式: echo 和 print。 本章节中我们会详细讨论两个语句的用法,并在实例中演示如何使用 echo 和 print。 PHP echo 和 print 语句 echo 和 print 区别: echo - 可以输出一个或多个字符串 print - 只允许输出一个字符串,返回值总为 1 提示:echo 输出

  • PHP Cookie

    PHP Cookie cookie 常用于识别用户。 Cookie 是什么? cookie 常用于识别用户。cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。 如何创建 Cookie? setcookie() 函数用于设置 cookie。 注释:setcookie

PHP RESTful

REST(英文:Representational State Transfer,简称REST) ,指的是一组架构约束条件和原则。

符合REST设计风格的Web API称为RESTful API。它从以下三个方面资源进行定义:

  • 直观简短的资源地址:URI,比如:https://example.com/resources/
  • 传输的资源:Web服务接受与返回的互联网媒体类型,比如:JSON,XML,YAM等。
  • 对资源的操作:Web服务在该资源上所支持的一系列请求方法(比如:POST,GET,PUT或DELETE)。

本教程我们将使用 PHP(不用框架) 来创建一个 RESTful web service,在文章末尾你可以下载本章节使用到的代码。

通过本教程你将学习到以下内容:

  • 创建一个 RESTful Webservice。
  • 使用原生 PHP, 不依赖任何框架。
  • URI 模式需要遵循 REST 规则。
  • RESTful service 接受与返回的格式可以是 JSON, XML等。
  • 根据不同情况响应对应的 HTTP 状态码。
  • 演示请求头的使用。
  • 使用 REST 客户端来测试 RESTful web service。

RESTful Webservice 实例

以下代码是 RESTful 服务类 Site.php


<?php
/* 
 * 爱学习网教程 RESTful 演示实例
 * RESTful 服务类
 */
Class Site {
    
    private $sites = array(
        1 => 'TaoBao',  
        2 => 'Google',  
        3 => 'lvstudy',              
        4 => 'Baidu',              
        5 => 'Weibo',  
        6 => 'Sina'
            
    );
        
    
    public function getAllSite(){
        return $this->sites;
    }
    
    public function getSite($id){
        
        $site = array($id => ($this->sites[$id]) ? $this->sites[$id] : $this->sites[1]);
        return $site;
    }    
}
?>

RESTful Services URI 映射

RESTful Services URI 应该设置为一个直观简短的资源地址。Apache 服务器的 .htaccess 应设置好对应的 Rewrite 规则。

本实例我们将使用两个 URI 规则:

1、获取所有站点列表:


https://localhost/restexample/site/list/

2、使用 id 获取指定的站点,以下 URI 为获取 id 为 3 的站点:


https://localhost/restexample/site/list/3/

项目的 .htaccess 文件配置规则如下所示:


# 开启 rewrite 功能

Options +FollowSymlinks

RewriteEngine on

# 重写规则

RewriteRule ^site/list/$   RestController.php?view=all [nc,qsa]

RewriteRule ^site/list/([0-9]+)/$   RestController.php?view=single&id=$1 [nc,qsa]

RESTful Web Service 控制器

.htaccess 文件中,我们通过设置参数 'view' 来获取 RestController.php 文件中对应的请求,通过获取 'view' 不同的参数来分发到不同的方法上。RestController.php 文件代码如下:


<?php
require_once("SiteRestHandler.php");
        
$view = "";
if(isset($_GET["view"]))
    $view = $_GET["view"];
/*
 * RESTful service 控制器
 * URL 映射
*/
switch($view){
 
    case "all":
        // 处理 REST Url /site/list/
        $siteRestHandler = new SiteRestHandler();
        $siteRestHandler->getAllSites();
        break;
        
    case "single":
        // 处理 REST Url /site/show/<id>/
        $siteRestHandler = new SiteRestHandler();
        $siteRestHandler->getSite($_GET["id"]);
        break;
 
    case "" :
        //404 - not found;
        break;
}
?>

简单的 RESTful 基础类

以下提供了 RESTful 的一个基类,用于处理响应请求的 HTTP 状态码,SimpleRest.php 文件代码如下:


<?php 
/*
 * 一个简单的 RESTful web services 基类
 * 我们可以基于这个类来扩展需求
*/
class SimpleRest {
    
    private $httpVersion = "HTTP/1.1";
 
    public function setHttpHeaders($contentType, $statusCode){
        
        $statusMessage = $this -> getHttpStatusMessage($statusCode);
        
        header($this->httpVersion. " ". $statusCode ." ". $statusMessage);        
        header("Content-Type:". $contentType);
    }
    
    public function getHttpStatusMessage($statusCode){
        $httpStatus = array(
            100 => 'Continue',  
            101 => 'Switching Protocols',  
            200 => 'OK',
            201 => 'Created',  
            202 => 'Accepted',  
            203 => 'Non-Authoritative Information',  
            204 => 'No Content',  
            205 => 'Reset Content',  
            206 => 'Partial Content',  
            300 => 'Multiple Choices',  
            301 => 'Moved Permanently',  
            302 => 'Found',  
            303 => 'See Other',  
            304 => 'Not Modified',  
            305 => 'Use Proxy',  
            306 => '(Unused)',  
            307 => 'Temporary Redirect',  
            400 => 'Bad Request',  
            401 => 'Unauthorized',  
            402 => 'Payment Required',  
            403 => 'Forbidden',  
            404 => 'Not Found',  
            405 => 'Method Not Allowed',  
            406 => 'Not Acceptable',  
            407 => 'Proxy Authentication Required',  
            408 => 'Request Timeout',  
            409 => 'Conflict',  
            410 => 'Gone',  
            411 => 'Length Required',  
            412 => 'Precondition Failed',  
            413 => 'Request Entity Too Large',  
            414 => 'Request-URI Too Long',  
            415 => 'Unsupported Media Type',  
            416 => 'Requested Range Not Satisfiable',  
            417 => 'Expectation Failed',  
            500 => 'Internal Server Error',  
            501 => 'Not Implemented',  
            502 => 'Bad Gateway',  
            503 => 'Service Unavailable',  
            504 => 'Gateway Timeout',  
            505 => 'HTTP Version Not Supported');
        return ($httpStatus[$statusCode]) ? $httpStatus[$statusCode] : $status[500];
    }
}
?>

RESTful Web Service 处理类

以下是一个 RESTful Web Service 处理类 SiteRestHandler.php,继承了上面我们提供的 RESTful 基类,类中通过判断请求的参数来决定返回的 HTTP 状态码及数据格式,实例中我们提供了三种数据格式: "application/json" 、 "application/xml" 或 "text/html":

SiteRestHandler.php 文件代码如下:


<?php 
require_once("SimpleRest.php");
require_once("Site.php");
 
class SiteRestHandler extends SimpleRest {
 
    function getAllSites() {    
 
        $site = new Site();
        $rawData = $site->getAllSite();
 
        if(empty($rawData)) {
            $statusCode = 404;
            $rawData = array('error' => 'No sites found!');        
        } else {
            $statusCode = 200;
        }
 
        $requestContentType = $_SERVER['HTTP_ACCEPT'];
        $this ->setHttpHeaders($requestContentType, $statusCode);
                
        if(strpos($requestContentType,'application/json') !== false){
            $response = $this->encodeJson($rawData);
            echo $response;
        } else if(strpos($requestContentType,'text/html') !== false){
            $response = $this->encodeHtml($rawData);
            echo $response;
        } else if(strpos($requestContentType,'application/xml') !== false){
            $response = $this->encodeXml($rawData);
            echo $response;
        }
    }
    
    public function encodeHtml($responseData) {
    
        $htmlResponse = "<table border='1'>";
        foreach($responseData as $key=>$value) {
                $htmlResponse .= "<tr><td>". $key. "</td><td>". $value. "</td></tr>";
        }
        $htmlResponse .= "</table>";
        return $htmlResponse;        
    }
    
    public function encodeJson($responseData) {
        $jsonResponse = json_encode($responseData);
        return $jsonResponse;        
    }
    
    public function encodeXml($responseData) {
        // 创建 SimpleXMLElement 对象
        $xml = new SimpleXMLElement('<?xml version="1.0"?><site></site>');
        foreach($responseData as $key=>$value) {
            $xml->addChild($key, $value);
        }
        return $xml->asXML();
    }
    
    public function getSite($id) {
 
        $site = new Site();
        $rawData = $site->getSite($id);
 
        if(empty($rawData)) {
            $statusCode = 404;
            $rawData = array('error' => 'No sites found!');        
        } else {
            $statusCode = 200;
        }
 
        $requestContentType = $_SERVER['HTTP_ACCEPT'];
        $this ->setHttpHeaders($requestContentType, $statusCode);
                
        if(strpos($requestContentType,'application/json') !== false){
            $response = $this->encodeJson($rawData);
            echo $response;
        } else if(strpos($requestContentType,'text/html') !== false){
            $response = $this->encodeHtml($rawData);
            echo $response;
        } else if(strpos($requestContentType,'application/xml') !== false){
            $response = $this->encodeXml($rawData);
            echo $response;
        }
    }
}
?>

接下来我们通过 https://localhost/restexample/site/list/ 访问,输出结果如下:

RESTful Web Service 客户端

接下来我们可以使用 Google Chrome 浏览器的 "Advance Rest Client" 作为 RESTful Web Service 客户端来请求我们的服务。

实例中请求 https://localhost/restexample/site/list/ 地址,接收数据类似为 Accept: application/json

请求 id 为 3 的站点 lvstudy(爱学习网教程),访问地址为 https://localhost/restexample/site/list/3/,

源码下载

实例中使用到的代码可点击以下按钮下载:

源码下载

关于我们 免责声明 联系我们
Copyright © 2020 爱学习网 浙ICP备18049359号 网站地图 Google地图