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的校验场景了。

相关文章
|
8月前
|
安全 测试技术 API
电商API接口开发:基础架构搭建全攻略
本文详细解析了电商API接口从零搭建基础架构的全流程。首先通过需求分析明确业务功能与接口规范,选定数据格式(如JSON)及通信方式(如RESTful)。接着在架构设计阶段选择合适的技术栈、数据库方案,并引入API网关实现统一管理。开发实现部分涵盖认证授权、数据访问、日志记录与异常处理等核心功能。安全防护则强调数据加密、传输安全及速率限制策略。测试优化阶段包括单元测试、集成测试、性能与安全测试,确保接口稳定性。最后通过工具生成清晰的API文档并实施版本控制,为开发者提供便利。整体流程系统化、模块化,助力打造高效、安全的电商API接口。
|
8月前
|
缓存 负载均衡 监控
微服务架构下的电商API接口设计:策略、方法与实战案例
本文探讨了微服务架构下的电商API接口设计,旨在打造高效、灵活与可扩展的电商系统。通过服务拆分(如商品、订单、支付等模块)和标准化设计(RESTful或GraphQL风格),确保接口一致性与易用性。同时,采用缓存策略、负载均衡及限流技术优化性能,并借助Prometheus等工具实现监控与日志管理。微服务架构的优势在于支持敏捷开发、高并发处理和独立部署,满足电商业务快速迭代需求。未来,电商API设计将向智能化与安全化方向发展。
518 102
|
4月前
|
存储 监控 安全
132_API部署:FastAPI与现代安全架构深度解析与LLM服务化最佳实践
在大语言模型(LLM)部署的最后一公里,API接口的设计与安全性直接决定了模型服务的可用性、稳定性与用户信任度。随着2025年LLM应用的爆炸式增长,如何构建高性能、高安全性的REST API成为开发者面临的核心挑战。FastAPI作为Python生态中最受青睐的Web框架之一,凭借其卓越的性能、强大的类型安全支持和完善的文档生成能力,已成为LLM服务化部署的首选方案。
|
7月前
|
缓存 监控 API
电商API的微服务架构优化策略
随着电商快速发展,API成为连接用户、商家与系统的核心。本文探讨微服务架构下电商API的优化策略,分析高并发、低延迟与数据一致性等挑战,并提供服务拆分、缓存异步、监控容器化等实践方案,助力构建高性能、高可用的电商系统,提升用户体验与业务效率。
210 0
|
7月前
|
JSON JavaScript 前端开发
Python+JAVA+PHP语言,苏宁商品详情API
调用苏宁商品详情API,可通过HTTP/HTTPS发送请求并解析响应数据,支持多种编程语言,如JavaScript、Java、PHP、C#、Ruby等。核心步骤包括构造请求URL、发送GET/POST请求及解析JSON/XML响应。不同语言示例展示了如何获取商品名称与价格等信息,实际使用时请参考苏宁开放平台最新文档以确保兼容性。
|
API PHP
2025宝塔API一键建站系统PHP源码
2025宝塔API一键建站系统PHP源码
368 90
|
设计模式 负载均衡 监控
探索微服务架构下的API网关设计
在微服务的大潮中,API网关如同一座桥梁,连接着服务的提供者与消费者。本文将深入探讨API网关的核心功能、设计原则及实现策略,旨在为读者揭示如何构建一个高效、可靠的API网关。通过分析API网关在微服务架构中的作用和挑战,我们将了解到,一个优秀的API网关不仅要处理服务路由、负载均衡、认证授权等基础问题,还需考虑如何提升系统的可扩展性、安全性和可维护性。文章最后将提供实用的代码示例,帮助读者更好地理解和应用API网关的设计概念。
341 8
|
JSON 数据挖掘 API
如何使用PHP开发1688商品详情API接口
本文详细介绍了如何使用PHP开发1688商品详情API接口,涵盖从注册账号、申请权限、配置环境到代码实现的全过程。通过设置请求头、参数及生成签名,利用cURL或GuzzleHttp库发送请求并处理响应,最终实现商品详情数据的获取与应用,助力电商发展。
250 1
|
缓存 API 数据库
Python哪个框架合适开发速卖通商品详情api?
在跨境电商平台速卖通的商品详情数据获取与整合中,Python 语言及其多种框架(如 Flask、Django、Tornado 和 FastAPI)提供了高效解决方案。Flask 简洁灵活,适合快速开发;Django 功能全面,适用于大型项目;Tornado 性能卓越,擅长处理高并发;FastAPI 结合类型提示和异步编程,开发体验优秀。选择合适的框架需综合考虑项目规模、性能要求和团队技术栈。
172 2
|
安全 API 数据库
Python哪个框架合适开发淘宝商品详情api?
在数字化商业时代,开发淘宝商品详情API成为企业拓展业务的重要手段。Python凭借其强大的框架支持,如Flask、Django、Tornado和FastAPI,为API开发提供了多样化的选择。本文探讨了这些框架的特点、优势及应用场景,帮助开发者根据项目需求选择最合适的工具,确保API的高效、稳定与可扩展性。
194 0