「IM系列」WebSocket教程:响应格式规范与异常处理

「IM系列」WebSocket教程:响应格式规范与异常处理

俗话说无规矩不成方圆,一个接口一种数据响应格式,一个开发人员一种开发格式,导致代码不规范,数据解析复杂化,维护更是难上加难。——开源技术小栈

数据格式

数据格式约定

  1. 必须返回统一的数据结构
  2. 查询不到数据时, 即空数据的情况下返回给客户端统一的数据结构格式
  3. 服务端和客户端都需要保证JSON格式的合法性

状态码规范

状态码 英文名称 描述
200 OK 请求成功
400 Bad Request 业务错误,语义有误,当前请求无法被服务器理解
401 Unauthorized 认证失败,当前请求需要用户验证
403 Forbidden 无权限调用,服务器已经理解请求,但是拒绝执行它
404 Not Found 暂无数据
500 Internal Server Error 服务器内部错误,无法完成请求

常见数据格式

基础响应格式

{
    "code":200,
    "msg":"success",
    "data":{}
}

对象格式

{
    "code":200,
    "msg":"success",
    "data":{
        "id":10086,
        "name":"Tinywan",
        "age":20,
        "sex":1
    }
}

数组格式

{
    "code":200,
    "msg":"ok",
    "data":[{
       "id":1,
       "name":"poppy",
       "age":20
     },{
       "id":2,
       "name":"thorn",
       "age":18
     }]
}

分页列表格式

{
    "code":200,
    "msg":"ok",
    "data":{
        "total":10,
        "list":[
            {
                "id":1,
                "name":"poppy",
                "age":20
            },
            {
                "id":2,
                "name":"thorn",
                "age":18
            }
        ]
    }
}

文件格式

{
    "code":200,
    "msg":"ok",
    "data":[
        "https://tinywan.com/file/upliad/20172514.jpg",
        "https://tinywan.com/file/upliad/20172515.jpg"
    ]
}

封装一个统一函数

/**
 * @desc: 消息广播json数据
 * @param int $code
 * @param string $msg
 * @param array $data
 * @return false|string
 * @author Tinywan(ShaoBo Wan)
 */

function broadcast_json(int $code = 0, string $msg = 'success', array $data = [])
{
    return json_encode(['code' => $code, 'msg' => $msg, 'data' => $data], JSON_UNESCAPED_UNICODE);
}

上一章代码优化

/**
 * @desc onMessage
 * @param string $clientId
 * @param string $message
 * @return false
 * @author Tinywan(ShaoBo Wan)
 */
public static function onMessage(string $clientId, string $message): bool
{
    $originMessage = json_decode($messagetrue);
    if (json_last_error() != JSON_ERROR_NONE) {
        Gateway::closeClient($clientId, json_encode([
            'code' => 500,
            'msg' => '无效的json数据'
        ], JSON_UNESCAPED_UNICODE));
        return false;
    }
    return Gateway::sendToClient($clientId, json_encode([
        'code' => 200,
        'msg' => '请求发送成功',
        'data' => $originMessage
    ], JSON_UNESCAPED_UNICODE));
}

使用 broadcast_json 行数优化后代码

/**
 * @desc onMessage
 * @param string $clientId
 * @param string $message
 * @return false
 * @author Tinywan(ShaoBo Wan)
 */
public static function onMessage(string $clientId, string $message): bool
{
    $originMessage = json_decode($messagetrue);
    if (json_last_error() != JSON_ERROR_NONE) {
        Gateway::closeClient($clientId, broadcast_json(400, '无效的json数据'));
        return false;
    }
    return Gateway::sendToClient($clientId, broadcast_json(400, '请求成功'$originMessage));
}

测试请求响应

「IM系列」WebSocket教程:响应格式规范与异常处理

异常处理

异常是什么?

PHP中的异常的独特性,即PHP中的异常不同于主流语言C++、java中的异常。在Java中,异常是唯一的错误报告方式,而在PHP中却不是这样,而是把所有不正常的情况都视作了错误进行处理。这两种语言对异常和错误的界定存在分歧。什么是异常什么是错误,两种语言的设计者存在不同的观点。

这里使用set_error_handler(error_function, error_type)函数设置自定义错误处理函数,接管原错误处理函数。

set_error_handler — 设置用户自定义的错误处理函数,本函数可用于在运行时定义自定义错误处理程序,例如,在应用程序中发生严重错误,或者在特定条件下触发了错误(使用 trigger_error()),应用程序需要执行文件/数据清理。

自定义错误处理函数

修改pluginwebmangatewayEvents.php业务处理事件onWorkerStart()方法,设置自定义错误处理函数,接管原错误处理函数。

/**
 * @desc: 当客户端连接上gateway完成websocket握手时触发
 * @param Worker $worker
 * @throws ErrorException
 * @author Tinywan(ShaoBo Wan)
 */
public static function onWorkerStart(Worker $worker)
{
    set_error_handler(function ($severity$message$file$line) use ($worker) {
        if (!(error_reporting() & $severity)) {
            return;
        }
        throw new ErrorException($message, 0, E_ERROR, $file$line);
    });
}

修改pluginwebmangatewayEvents.php业务处理事件onMessage()方法,抛出一个异常。

/**
 * @desc: 当客户端连接上gateway完成websocket握手时触发
 * @param Worker $worker
 * @throws ErrorException
 * @author Tinywan(ShaoBo Wan)
 */
public static function onMessage(string $clientId, string $message): bool
{
    try {
        $originMessage = json_decode($messagetrue);
        if (json_last_error() != JSON_ERROR_NONE) {
            Gateway::closeClient($clientId, broadcast_json(400, '无效的json数据'));
            return false;
        }
        // 被除数为0的异常
        $aa = 1/0;
        var_dump($aa);
    } catch (Throwable $throwable) {
        return Gateway::sendToClient($clientId, broadcast_json(500, $throwable->getMessage()));
    }
    return Gateway::sendToClient($clientId, broadcast_json(200, '请求成功'$originMessage));
}

console 控制台

「IM系列」WebSocket教程:响应格式规范与异常处理

网络发送和接受情况

「IM系列」WebSocket教程:响应格式规范与异常处理

这样子可以保证进程不会被退出

「IM系列」WebSocket教程:响应格式规范与异常处理

源码

文章相关源码地址:https://github.com/Tinywan/webman-admin


原文始发于微信公众号(开源技术小栈):「IM系列」WebSocket教程:响应格式规范与异常处理

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/247998.html

(0)
李, 若俞的头像李, 若俞

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!