PHP 基于 SW-X 框架,搭建高性能API架构(五)

简介: 本章节学习在SW-X框架中,如何过滤404请求,并使用注解限制请求类型,使用Validate验证器组件过滤表单数据。

前言

官网地址:SW-X框架-专注高性能便捷开发而生的PHP-SwooleX框架

希望各大佬举起小手,给小弟一个star:https://github.com/swoolex/swoolexlex

1、404接口配置

HTTP服务中,当查找不到对应的路由时,会加载/config/route.php配置文件中的404配置。

以下为具体的参数配置项:

<?php
return [
    // 找不到路由的时候,是否启用自定义的错误处理程序
    '404' => true,
    // 自定义的错误处理程序,只需要提供一个类的命名空间位置即可
    'error_class' => '\\box\\http_error',
];

下面我们打开/box/http_error.php文件,并修改成以下代码:

<?php
namespace box;
use \x\controller\Http;
class http_error  extends Http{
    /**
     * 入口
     * @todo 无
     * @author 小黄牛
     * @version v1.0.1 + 2020.05.29
     * @deprecated 暂不启用
     * @global 无
     * @return void
    */
    public function __construct() {
        return \x\Restful::code(\x\Restful::ONROUTE())->callback();
    }
}

由于上面使用\x\Restful组件,抛出了一个ONROUTE状态码,所以对应的Restful配置也要进行修改:

/restful/default/code.php修改成如下代码:

<?php
return [
    'ERROR' => 0, // 默认失败状态码
    'SUCCESS' => 1, // 默认成功状态码
    'ACTION_ERROR' => 40001, // 权限校验失败
    'ONROUTE' => 40004, // 不存在的接口
];

/restful/default/msg.php修改成如下代码:

<?php
return [
    // 默认错误状态码对应的tips
    'ERROR' => [
        'default' => '请求失败', // 默认值
    ],
    // 默认成功状态码对应的tips
    'SUCCESS' => [
        'default' => '请求成功', // 默认值
        'test' => '测试msg',
    ],
    // 权限校验失败
    'ACTION_ERROR' => [
        'default' => '权限校验失败', // 默认值
    ],
    // 不存在的接口
    'ONROUTE' => [
        'default' => '该接口不存在', // 默认值
    ],
];


这时候我们随便访问一个不存在的接口,http://IP地址:端口/api/user/info,就可以看到框架抛出了下面的状态码:

{
  "code": 40004,
  "msg": "该接口不存在",
  "data": []
}

2、请求类型限制

SW-X中需要限制某个HTTP控制器的请求类型有多种方式,

第1种是使用@Post@Get@Ajax注解进行限制。

第2种,则是使用\x\Validate验证器组件,对请求头进行判断过滤。

一般建议使用第1种方式,因为非常灵活,而第2种一般是用于对某些同组接口需要进行相同请求头过滤,例如签名判断等业务时使用。

下面,我们将/app/http/v1_0_1/controller/shop/delete.php控制器改代码如下:

<?php
namespace app\http\v1_0_1\controller\shop;
use x\controller\Http;
// 引入Restful组件
use x\Restful;
class delete extends Http
{
    /**
     * 我只允许Post+Ajax的请求
     * @Post
     * @Ajax
    */
    public function index() {
        // Restful组件抛出接口响应
        return Restful::code(Restful::SUCCESS())->data('您的请求通过啦')->callback();
    }
}

同时,由于该注解的错误信息是由/box/lifecycle/route_error.php生命周期文件进行回调处理,所以我们还需要将该文件改成以下代码:

<?php
namespace box\lifecycle;
class route_error
{
    /**
     * 特殊转换3种注解的Msg值
    */
    private $tips = [
        'Route Method Get'  => '只允许Get请求',
        'Route Method Post' => '只允许Post请求',
        'Route Method Ajax' => '只允许Ajax请求',
    ];
    /**
     * 接受回调处理
     * @todo 无
     * @author 小黄牛
     * @version v1.1.5 + 2020.07.15
     * @deprecated 暂不启用
     * @global 无
     * @param Swoole $server 服务实例
     * @param string $fd 客户端标识
     * @param string $status 错误事件状态码
     * @return bool
    */
    public function run($server, $fd, $status) {
        $tips = 'Annotate:SW-X Status:'.$status.' ERROR !';
        $type = \x\Config::get('server.sw_service_type');
        // 只处理HTTP服务请求的抛出
        if ($type == 'http') {
            if (isset($this->tips[$status])) $tips = $this->tips[$status];
            return \x\Restful::code(\x\Restful::LIFECYCLE())->setMsg($tips)->callback();
        }
        return true;
    }
}

由于上面使用\x\Restful组件,抛出了一个LIFECYCLE状态码,所以对应的Restful配置也要进行修改:

/restful/default/code.php修改成如下代码:

<?php
return [
    'ERROR' => 0, // 默认失败状态码
    'SUCCESS' => 1, // 默认成功状态码
    'ACTION_ERROR' => 40001, // 权限校验失败
    'ONROUTE' => 40004, // 不存在的接口
    'LIFECYCLE' => 20001, // 路由生命周期错误回调状态码[使用自定义MSG]
];

注意,生命周期文件修改后,热重载无效,需要手动stop后,重新start服务。

完成重启后,我们再访问http://IP地址:端口/api/shop/delete接口,就可以看到框架抛出了下面的状态码:

{
  "code": 20001,
  "msg": "只允许Post请求",
  "data": []
}

如果要测试请求成功,可以使用Postman或Jquery等工具,发送Post-Ajax请求即可。

3、Validate校验表单数据

SW-X种推荐使用\x\Validate验证器组件,对请求进行判断过滤。

具体的使用方法,可以参考官方文档:https://www.sw-x.cn/word/v2.5.x/vali_explain.html

下面我们来创建一个Shop校验器,用于针对商品分组的API请求。

创建验证器文件/box/validate/Shop.php,写入代码如下:

<?php
namespace box\validate;
use x\Validate;
class Shop extends Validate
{
    // 定义字段对应的规则
    protected $rule = [
        'id' => 'require|int',
        'title'  =>  'require|min:10|max:20',
        'info.des' =>  'min:10|max:20',
    ];
    // 自定义错误值声明
    protected $message  =   [
        'id.require'   => '{id}忘记输入啦',
        'title.min'     => '{title}不能小于{0}',
        'title.max'     => '{title}不能大于{0}',
        'info.des.min' => '{:preset}不能小于{0}',
        'info.des.min' => '{info.des}不能大于{0}',
    ];
    // 场景定义
    protected $scene = [
        // 修改时使用的场景(简写)
        'edit'  =>  ['id','info.des'], // 需要校验的字段
        // 删除时使用的场景(简写)
        'delete'  =>  ['id'], // 需要校验的字段
    ];
}

下面,我们将/app/http/v1_0_1/controller/shop/delete.php控制器改代码如下:

<?php
namespace app\http\v1_0_1\controller\shop;
use x\controller\Http;
// 引入Restful组件
use x\Restful;
class delete extends Http
{
    /**
     * 使用注解绑定校验器
     * @Validate(class="\box\validate\Shop", scene="delete")
    */
    public function index() {
        // Restful组件抛出接口响应
        return Restful::code(Restful::SUCCESS())->data('校验通过啦')->callback();
    }
}

同时,由于该注解的错误信息是由/box/lifecycle/validate_error.php生命周期文件进行回调处理,所以我们还需要将该文件改成以下代码:

<?php
namespace box\lifecycle;
class validate_error
{
    /**
     * 接受回调处理
     * @todo 无
     * @author 小黄牛
     * @version v2.5.6 + 2021-09-15
     * @deprecated 暂不启用
     * @global 无
     * @param string $server_type 服务类型 http/websocket/rpc/mqtt
     * @param bool $batch 是否全部过滤
     * @param array $errors 错误验证结果集
     * @return bool
    */
    public function run($server_type, $batch, $errors) {
        // $batch 是用于执行全部过滤规则,再最后一起返回全部的错误原因
        // 默认生命周期只返回第一个错误原因
        $error = $errors[0]['intact_field'].' => '.$errors[0]['message'];
        // 只处理HTTP服务请求的抛出
        if ($server_type == 'http') {
            return \x\Restful::code(\x\Restful::VALIDATE())->setMsg($errors[0]['message'])->callback();
        }
        return true;
    }
}

由于上面使用\x\Restful组件,抛出了一个VALIDATE状态码,所以对应的Restful配置也要进行修改:

/restful/default/code.php修改成如下代码:

<?php
return [
    'ERROR' => 0, // 默认失败状态码
    'SUCCESS' => 1, // 默认成功状态码
    'ACTION_ERROR' => 40001, // 权限校验失败
    'ONROUTE' => 40004, // 不存在的接口
    'LIFECYCLE' => 20001, // 路由生命周期错误回调状态码[使用自定义MSG]
    'VALIDATE' => 20002, // 校验器生命周期错误回调状态码[使用自定义MSG]
];

注意,生命周期文件修改后,热重载无效,需要手动stop后,重新start服务。

完成重启后,我们再访问http://IP地址:端口/api/shop/delete接口,就可以看到框架抛出了下面的状态码:

{
  "code": 20002,
  "msg": "id忘记输入啦",
  "data": []
}

访问http://IP地址:端口/api/shop/delete?id=1,就可以通过delete的校验场景了。

相关文章
|
26天前
|
缓存 负载均衡 JavaScript
探索微服务架构下的API网关模式
【10月更文挑战第37天】在微服务架构的海洋中,API网关犹如一座灯塔,指引着服务的航向。它不仅是客户端请求的集散地,更是后端微服务的守门人。本文将深入探讨API网关的设计哲学、核心功能以及它在微服务生态中扮演的角色,同时通过实际代码示例,揭示如何实现一个高效、可靠的API网关。
|
2月前
|
缓存 监控 API
探索微服务架构中的API网关模式
【10月更文挑战第5天】随着微服务架构的兴起,企业纷纷采用这一模式构建复杂应用。在这种架构下,应用被拆分成若干小型、独立的服务,每个服务围绕特定业务功能构建并通过HTTP协议协作。随着服务数量增加,统一管理这些服务间的交互变得至关重要。API网关作为微服务架构的关键组件,承担起路由请求、聚合数据、处理认证与授权等功能。本文通过一个在线零售平台的具体案例,探讨API网关的优势及其实现细节,展示其在简化客户端集成、提升安全性和性能方面的关键作用。
75 2
|
23天前
|
消息中间件 缓存 架构师
关于 Kafka 高性能架构,这篇说得最全面,建议收藏!
Kafka 是一个高吞吐量、高性能的消息中间件,关于 Kafka 高性能背后的实现,是大厂面试高频问题。本篇全面详解 Kafka 高性能背后的实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
关于 Kafka 高性能架构,这篇说得最全面,建议收藏!
|
1月前
|
存储 SQL Apache
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
Apache Doris 是一个基于 MPP 架构的高性能实时分析数据库,以其极高的速度和易用性著称。它支持高并发点查询和复杂分析场景,适用于报表分析、即席查询、数据仓库和数据湖查询加速等。最新发布的 2.0.2 版本在性能、稳定性和多租户支持方面有显著提升。社区活跃,已广泛应用于电商、广告、用户行为分析等领域。
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
|
27天前
|
SQL 缓存 测试技术
构建高性能RESTful API:最佳实践与避坑指南###
—— 本文深入探讨了构建高性能RESTful API的关键技术要点,从设计原则、状态码使用、版本控制到安全性考虑,旨在为开发者提供一套全面的最佳实践框架。通过避免常见的设计陷阱,本文将指导你如何优化API性能,提升用户体验,确保系统的稳定性和可扩展性。 ###
57 12
|
28天前
|
API PHP 数据库
PHP中哪个框架最适合做API?
在数字化时代,API作为软件应用间通信的桥梁至关重要。本文探讨了PHP中适合API开发的主流框架,包括Laravel、Symfony、Lumen、Slim、Yii和Phalcon,分析了它们的特点和优势,帮助开发者选择合适的框架,提高开发效率、保证接口稳定性和安全性。
49 3
|
1月前
|
XML JSON API
【PHP开发专栏】PHP RESTful API设计与开发
随着互联网技术的发展,前后端分离成为Web开发的主流模式。本文介绍RESTful API的基本概念、设计原则及在PHP中的实现方法。RESTful API是一种轻量级、无状态的接口设计风格,通过HTTP方法(GET、POST、PUT、DELETE)操作资源,使用JSON或XML格式传输数据。在PHP中,通过定义路由、创建控制器、处理HTTP请求和响应等步骤实现RESTful API,并强调了安全性的重要性。
25 2
|
1月前
|
监控 安全 应用服务中间件
微服务架构下的API网关设计策略与实践####
本文深入探讨了在微服务架构下,API网关作为系统统一入口点的设计策略、实现细节及其在实际应用中的最佳实践。不同于传统的摘要概述,本部分将直接以一段精简的代码示例作为引子,展示一个基于NGINX的简单API网关配置片段,随后引出文章的核心内容,旨在通过具体实例激发读者兴趣,快速理解API网关在微服务架构中的关键作用及实现方式。 ```nginx server { listen 80; server_name api.example.com; location / { proxy_pass http://backend_service:5000;
|
1月前
|
缓存 监控 API
探索微服务架构中的API网关模式
随着微服务架构的兴起,API网关成为管理和服务间交互的关键组件。本文通过在线零售公司的案例,探讨了API网关在路由管理、认证授权、限流缓存、日志监控和协议转换等方面的优势,并详细介绍了使用Kong实现API网关的具体步骤。
46 3
|
1月前
|
存储 缓存 监控
探索微服务架构中的API网关模式
探索微服务架构中的API网关模式
48 2