首页 > 编程语言 >PHP实现RESTful风格的API实例

PHP实现RESTful风格的API实例

时间:2023-09-04 10:01:30浏览次数:38  
标签:return name RESTful self request API PHP data class

PHP实现RESTful风格的API实例_php

Request.php :包含一个Request类,即数据操作类。接收到URL的数据后,根据请求URL的方式(GET|POST|PUT|PATCH|DELETE)对数据进行相应的增删改查操作,并返回操作后的结果:

<?php
/**
 * 数据操作类
 */
class Request {
    //允许的请求方式
    private static $method_type = array('get', 'post', 'put', 'patch', 'delete');
    //测试数据
    private static $test_class = array(
        1 => array('name' => '托福班', 'count' => 18),
        2 => array('name' => '雅思班', 'count' => 20),
    );


    public static function getRequest() {
        //请求方式
        $method = strtolower($_SERVER['REQUEST_METHOD']);
        if (in_array($method, self::$method_type)) {
            //调用请求方式对应的方法
            $data_name = $method . 'Data';
            return self::$data_name($_REQUEST);
        }
        return false;
    }


    //GET 获取信息
    private static function getData($request_data) {
        $class_id = (int)$request_data['class'];
        //GET /class/ID:获取某个指定班的信息
        if ($class_id > 0) {
            return self::$test_class[$class_id];
        } else {//GET /class:列出所有班级
            return self::$test_class;
        }
    }


    //POST /class:新建一个班
    private static function postData($request_data) {
        if (!empty($request_data['name'])) {
            $data['name'] = $request_data['name'];
            $data['count'] = (int)$request_data['count'];
            self::$test_class[] = $data;
            return self::$test_class;//返回新生成的资源对象
        } else {
            return false;
        }
    }


    //PUT /class/ID:更新某个指定班的信息(全部信息)
    private static function putData($request_data) {
        $class_id = (int)$request_data['class'];
        if ($class_id == 0) {
            return false;
        }
        $data = array();
        if (!empty($request_data['name']) && isset($request_data['count'])) {
            $data['name'] = $request_data['name'];
            $data['count'] = (int)$request_data['count'];
            self::$test_class[$class_id] = $data;
            return self::$test_class;
        } else {
            return false;
        }
    }


    //PATCH /class/ID:更新某个指定班的信息(部分信息)
    private static function patchData($request_data) {
        $class_id = (int)$request_data['class'];
        if ($class_id == 0) {
            return false;
        }
        if (!empty($request_data['name'])) {
            self::$test_class[$class_id]['name'] = $request_data['name'];
        }
        if (isset($request_data['count'])) {
            self::$test_class[$class_id]['count'] = (int)$request_data['count'];
        }
        return self::$test_class;
    }


    //DELETE /class/ID:删除某个班
    private static function deleteData($request_data) {
        $class_id = (int)$request_data['class'];
        if ($class_id == 0) {
            return false;
        }
        unset(self::$test_class[$class_id]);
        return self::$test_class;
    }
}


Response.php :包含一个Request类,即输出类。根据接收到的Content-Type,将Request类返回的数组拼接成对应的格式,加上header后输出.

<?php
class Response {
    const HTTP_VERSION = "HTTP/1.1";
    //返回结果
    public static function sendResponse($data) {
        //获取数据
        if ($data) {
            $code = 200;
            $message = 'OK';
        } else {
            $code = 404;
            $data = array('error' => 'Not Found');
            $message = 'Not Found';
        }


        //输出结果
        header(self::HTTP_VERSION . " " . $code . " " . $message);
        $content_type = isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : $_SERVER['HTTP_ACCEPT'];
        if (strpos($content_type, 'application/json') !== false) {
            header("Content-Type: application/json");
            echo self::encodeJson($data);
        } else if (strpos($content_type, 'application/xml') !== false) {
            header("Content-Type: application/xml");
            echo self::encodeXml($data);
        } else {
            header("Content-Type: text/html");
            echo self::encodeHtml($data);
        }
    }


    //json格式
    private static function encodeJson($responseData) {
        return json_encode($responseData);
    }


    //xml格式
    private static function encodeXml($responseData) {
        $xml = new SimpleXMLElement('<?xml version="1.0"?><rest></rest>');
        foreach ($responseData as $key => $value) {
            if (is_array($value)) {
                foreach ($value as $k => $v) {
                    $xml->addChild($k, $v);
                }
            } else {
                $xml->addChild($key, $value);
            }
        }
        return $xml->asXML();
    }


    //html格式
    private static function encodeHtml($responseData) {
        $html = "<table border='1'>";
        foreach ($responseData as $key => $value) {
            $html .= "<tr>";
            if (is_array($value)) {
                foreach ($value as $k => $v) {
                    $html .= "<td>" . $k . "</td><td>" . $v . "</td>";
                }
            } else {
                $html .= "<td>" . $key . "</td><td>" . $value . "</td>";
            }
            $html .= "</tr>";
        }
        $html .= "</table>";
        return $html;
    }
}

index.php :入口文件,调用Request类取得数据后交给Response处理,最后返回结果

<?php
//数据操作类
require('Request.php');
//输出类
require('Response.php');
//获取数据
$data = Request::getRequest();
//输出结果
Response::sendResponse($data);

标签:return,name,RESTful,self,request,API,PHP,data,class
From: https://blog.51cto.com/u_15979955/7346034

相关文章

  • 通过商品数据API接口获取数据后的数据处理与利用
    ​ 在电子商务时代,商品数据API接口为开发者提供了方便快捷的商品数据获取途径。本文将介绍如何利用商品数据API接口获取数据,并对获取的数据进行清洗、整理和利用,以便为电商企业或开发者提供有价值的信息和洞察。一、获取商品数据API接口首先,我们需要找到一个可靠的商品数据API......
  • API接口详解大全
    ​一、API是什么?API,全称应用程序编程接口(ApplicationProgrammingInterface),是一种定义好的程序,它允许两个应用程序或者系统之间进行交互和数据交换。API提供了明确、标准化的接口规范,使得不同的软件能够通过相同的通信协议进行交互。二、API的作用?数据交互:API使得不同的软......
  • 界面控件DevExpress .NET应用安全 & Web API v23.1亮点:支持Swagger模式
    DevExpress拥有.NET开发需要的所有平台控件,包含600多个UI控件、报表平台、DevExpressDashboardeXpressApp框架、适用于VisualStudio的CodeRush等一系列辅助工具。DevExpress今年第一个重要版本v23.1日前已正式发布了,该版本拥有众多新产品和数十个具有高影响力的功能,可为桌......
  • 开创以API为核心的数字化变革,华为云实现API全生命周期一体化协作
    日前,在华为开发者大会2023(Cloud)的“开创以API为核心的数字化变革,实现API全生命周期一体化协作”专题论坛中,华为云产品专家、技术专家、伙伴、客户分享了在API领域中的先进管理经验与实践经验。针对当前企业API与微服务管理面临的挑战,华为云打造了API全生命周期管理平台——华为云Co......
  • PHP 中 array_walk 与array_map的区别
    array_map函数来对数组中的每个元素应用回调函数。该函数与array_walk类似**,但是它返回一个新的数组,而不是直接修改原始数组。**在PHP中,可以使用array_walk函数来遍历数组并执行自定义的操作。该函数接受三个参数:要遍历的数组、回调函数和数组元素的索引。回调函数应该接受......
  • 淘宝订单信息获取接口,淘宝订单信息获取API
    在日常电商软件开发的工作中,我们经常会遇到需要淘宝的订单信息的场景,比如:打单、发货,又比如做BI工具等。这就需要用到淘宝订单信息获取接口。只有获取到淘宝订单信息,才能进行下一步工作。获取淘宝订单信息,我们可以从淘宝开放平台上调用相关接口(相关接口当前可能不允许申请或者申请......
  • PHP 中 array_walk 与array_map的区别
    PHP中array_walk与array_map的区别array_map函数来对数组中的每个元素应用回调函数。该函数与array_walk类似,但是它返回一个新的数组,而不是直接修改原始数组。在PHP中,可以使用array_walk函数来遍历数组并执行自定义的操作。该函数接受三个参数:要遍历的数组、回调函数......
  • PHP extract() 函数
    PHPextract()Function定义和用法extract()函数从数组中将变量导入到当前的符号表。该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。第二个参数type用于指定当某个变量已经存在,而数组中又有同名元素时,ext......
  • asp.net restful ef core sqlite 自定义包的位置
    MagicVilla_VillaAPI/MagicVilla_VillaAPI.csproj<ProjectSdk="Microsoft.NET.Sdk.Web"><PropertyGroup><TargetFramework>net7.0</TargetFramework><Nullable>enable</Nullable><ImplicitUsings>e......
  • ⏱️TimeHelper——一个简单快捷的PHP日期时间助手类库
    TimeHelper是一个简单易用的PHP时间日期助手类库,可以快速实现常用的时间日期操作,比如获取指定时间的秒数,获取友好的时间格式,判断时间范围,计算两个时间相差值,返回N小时/天/星期/月/年前或者后的时间戳等等......