首页 > 其他分享 >hyperf统一请求响应

hyperf统一请求响应

时间:2024-04-18 23:01:16浏览次数:13  
标签:status return 请求 GlobalCode MSG 响应 hyperf getMessage DEBUG

2024年4月18日08:48:45

以下是两个方案:

1,使用注解,直接返回

<?php

namespace App\Utils;

use App\Utils\GlobalCode;
use App\Utils\GlobalMsg;
use Hyperf\Contract\ContainerInterface;
use Hyperf\Di\Annotation\Inject;
use Hyperf\HttpServer\Contract\RequestInterface;
use Hyperf\HttpServer\Contract\ResponseInterface;
use Throwable;

use function Hyperf\Support\env;

trait ResponseTrait
{
    #[Inject]
    protected RequestInterface $rt;
    #[Inject]
    protected ResponseInterface $re;

    public function success(mixed $data = '', string $msg = GlobalMsg::SUCCESS)
    {
        return $this->re->json([GlobalCode::CODE => GlobalCode::SUCCESS, GlobalCode::MSG => $msg, GlobalCode::DATA => $data]);
    }

    public function fail(Throwable $e, $status = 200, array $headers = [])
    {
        if ($this->rt->input('debug') == env('DEBUG', GlobalCode::DEBUG) || env('DEBUG') == GlobalCode::DEBUG) {
            return $this->re->json([GlobalCode::CODE => GlobalCode::FAIL, GlobalCode::MSG => $e->getMessage(), GlobalCode::DATA => $e->getTraceAsString()], $status, $headers);
        } else {
            return $this->re->json([GlobalCode::CODE => GlobalCode::FAIL, GlobalCode::MSG => $e->getMessage(), GlobalCode::DATA => $e->getMessage()], $status, $headers);
        }
    }

    public function grant(Throwable $e)
    {
        if ($this->rt->input('debug') == env('DEBUG', GlobalCode::DEBUG) || env('DEBUG') == GlobalCode::DEBUG) {
            return $this->re->json([GlobalCode::CODE => GlobalCode::GRANT, GlobalCode::MSG => $e->getMessage(), GlobalCode::DATA => $e->getTraceAsString()]);
        } else {
            return $this->re->json([GlobalCode::CODE => GlobalCode::GRANT, GlobalCode::MSG => $e->getMessage(), GlobalCode::DATA => $e->getMessage()]);
        }
    }

}

方案二: 像laravel 那样使用容器吧响应接口返回出来

<?php

namespace App\Utils;

use App\Utils\GlobalCode;
use App\Utils\GlobalMsg;
use Hyperf\Contract\ContainerInterface;
use Hyperf\Di\Annotation\Inject;
use Hyperf\HttpMessage\Stream\SwooleStream;
use Hyperf\HttpServer\Contract\RequestInterface;
use Hyperf\HttpServer\Contract\ResponseInterface;
use Throwable;
use Hyperf\Context\ApplicationContext;

use function Hyperf\Support\env;

trait ResponseTrait
{
    public function success(mixed $data = '', string $msg = GlobalMsg::SUCCESS, int $status = 200)
    {
        return self::response([GlobalCode::CODE => GlobalCode::SUCCESS, GlobalCode::MSG => $msg, GlobalCode::DATA => $data], $status);
    }

    public function fail(Throwable $e, int $status = 200)
    {
        if (self::request()->input('debug') == env('DEBUG', GlobalCode::DEBUG) || env('DEBUG') == GlobalCode::DEBUG) {
            return self::response([GlobalCode::CODE => GlobalCode::FAIL, GlobalCode::MSG => $e->getMessage(), GlobalCode::DATA => $e->getTraceAsString()], $status);
        } else {
            return self::response([GlobalCode::CODE => GlobalCode::FAIL, GlobalCode::MSG => $e->getMessage(), GlobalCode::DATA => $e->getMessage()], $status);
        }
    }

    public function grant(Throwable $e, int $status = 200)
    {
        if (self::request()->input('debug') == env('DEBUG', GlobalCode::DEBUG) || env('DEBUG') == GlobalCode::DEBUG) {
            return self::response([GlobalCode::CODE => GlobalCode::GRANT, GlobalCode::MSG => $e->getMessage(), GlobalCode::DATA => $e->getTraceAsString()], $status);
        } else {
            return self::response([GlobalCode::CODE => GlobalCode::GRANT, GlobalCode::MSG => $e->getMessage(), GlobalCode::DATA => $e->getMessage()], $status);
        }
    }


    private static function response(mixed $data = null, int $status = 200, int $options = JSON_UNESCAPED_UNICODE)
    {
        $response = self::container()->get(ResponseInterface::class);

        return $response->withStatus($status)->withAddedHeader('content-type', 'application/json; charset=utf-8')->withBody(new SwooleStream(json_encode($data, $options)));
    }

    private static function request()
    {
        return self::container()->get(RequestInterface::class);
    }

    /**
     * 容器实例
     * @return \Psr\Container\ContainerInterface
     */
    private static function container()
    {
        return ApplicationContext::getContainer();
    }
}

总结:方案一,很简单,但是不能控制header头部状态码,有些特殊返回需要控制的时候,就不行,方案二,稍微复杂一点,但是更完善

标签:status,return,请求,GlobalCode,MSG,响应,hyperf,getMessage,DEBUG
From: https://www.cnblogs.com/zx-admin/p/18142190

相关文章

  • hyperf windows使用docker搭建开发环境
    2024年4月13日23:44:16首先安装好docker注意:powershell是不支持命令换行符的dockerrun--namehyperf-vD:/code:/data-w/data-p9501:9501-it--privileged-uroothyperf/hyperf:8.1-alpine-v3.18-swoole或者使用最新版本dockerrun--namehyperf-vD:/code:/dat......
  • Jmeter如何判断请求的数据是Json还是表单格式
    就我个人而言,最简单的是使用curl命令执行下就知道了,比如我自己写的图书管理系统,flask框架图书管理系统服务器端-加个小鸡腿-博客园(cnblogs.com) ,python命令启动后是这样的 其中查询所有图书的接口是127.0.0.1:5000/books,我们打开浏览器输入这条url显示的数据是json格式......
  • 应急响应靶场Where-1S-tHe-Hacker
    应急响应实战靶场打开靶机,发现有两个用户,admin和admin$,一个是隐藏用户admin用户的密码是Aa123456杀软查杀进入主机,我们直接使用D盾和D-eyes杀软进行后台扫描,节省时间这边附上绿盟科技的D-Eyes的使用参数说明####Windows请以管理员身份运行cmd,之后再输入D-Eyes路径运......
  • delphi TApplicationEvents控件,响应程序级快捷键
    在窗体中插入TApplicationEvents控件,然后设置它的onMessage事件即可 procedureTForm1.ApplicationEventsMessage(varMsg:tagMSG;varHandled:Boolean);varAktywnaForma:TForm;begin//检查是否按下CTRL键并同时按下F7键if(Msg.wParam=VK_F7)and((......
  • Go 单元测试之HTTP请求与API测试
    目录一、httptest1.1前置代码准备1.2介绍1.3基本用法二、gock2.1介绍2.2安装2.3基本使用2.4举个例子2.4.1前置代码2.4.2测试用例一、httptest1.1前置代码准备假设我们的业务逻辑是搭建一个httpserver端,对外提供HTTP服务。用来处理用户登录请求,用户需要输入邮箱,密码。......
  • http请求头中application/x-www-form-urlencoded和multipart/form-data区别
    application/x-www-form-urlencoded和multipart/form-data是两种不同的Content-Type,它们在网络请求中(尤其是POST请求)用来指定表单数据的编码格式application/x-www-form-urlencoded:•这是最常见的表单数据编码方式,也是HTML表单的默认编码类型。•所有表单字段名和值都会......
  • PHP响应SSE
    使用PHP创建一个SSE响应来与客户端保持连接<?phpheader('Content-Type:text/event-stream');header('Cache-Control:no-cache');header('Connection:keep-alive');//模拟数据更新(实际应用中可能是从数据库查询、监控系统获取等)functiongenerateEventData(){$dat......
  • 面试官:一个 SpringBoot 项目能处理多少请求?(小心有坑)
    面试官:一个SpringBoot项目能处理多少请求?(小心有坑) 你好呀,我是歪歪。这篇文章带大家盘一个读者遇到的面试题哈。根据读者转述,面试官的原问题就是:一个SpringBoot项目能同时处理多少请求?不知道你听到这个问题之后的第一反应是什么。我大概知道他要问的是哪个方向,但......
  • 多值请求问题异常
    “多值请求异常问题”通常指的是在处理包含多个值的请求时遇到的异常情况。这种问题可能出现在各种场景中,例如HTTP请求中的表单数据、API请求中的参数列表、数据库查询中的多个条件等。具体的问题和解决方案取决于上下文和应用场景。以下是一些可能导致多值请求异常问题的常见原......
  • Ajax异步请求
    1.需求准备一个注册页面ajax.html,当鼠标点击输入框的时候提示“请输入用户名”,输入用户名后,点击输入密码或者其他空白处的时候提示“用户名可以使用”或者“用户名以重复,请重新输入用户名”。1.1准备页面1.2当鼠标点击输入框的时候提示“请输入用户名”(1)根据id获得input标签......