使用Swoole 构建API接口服务

Posted roverliang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Swoole 构建API接口服务相关的知识,希望对你有一定的参考价值。

网上类似的文章已经很多了,我也是刚入门。从头开始学习。所以如果重复写文章阐释,反而会浪费时间,于是就自己动手构建了一个demo,使用swoole 的TCP 服务器接受TCP客户端的发来的http请求,然后将GET请求简单分割,获取需要的参数,然后将参数重新返回给TCP客户端。这个例子,旨在说明TCP 是属于传输层,而我们获取HTTP请求后,怎样解析发送过来的文本是属于应用层,也就是平时apache 或者nginx帮我们做好的工作。

以下是全部代码,因为是练习代码,所以命名不太规范。本想要解析post请求和GET请求,但是实践之后发现,POST请求比较难解析,而已swoole已经有了完善的swoole_http_server 这个工具,可以帮助我处理好一些繁琐的准备工作,下面的代码只是用来展示自己对swoole的一些流程和理解,欢迎各位好友共同探讨。

<?php
/**
 * 用swoole 搭建一个API服务器
 */

$serv = new swoole_server(\'127.0.0.1\', 9888, SWOOLE_PROCESS, SWOOLE_SOCK_TCP);
$serv->set(array(
   \'worker_num\' => 4,
   \'daemonize\' => false,
   \'backlog\' => 128,
));

$serv->on(\'Connect\', \'onConnect\');
$serv->on(\'Receive\', \'onReceive\');
$serv->on(\'Close\', \'onClose\');

$serv->start();

/**
 *Http建立连接回调函数
 */
function onConnect($serv, $fd)
{
    echo "Server is running on 127.0.0.1:9888".PHP_EOL;
}

/**
 * 开始接受客户端信息回调函数
 */
function onReceive($serv, $fd, $from_id, $data)
{
    formatRequest($serv, $fd, $data);
}

/**
 * 连接关闭后回调函数
 */
function onClose($serv, $fd)
{
    return false;
}

/**
 * 封装response 的内容
 */
function response($serv, $fd, $res_data=\'\')
{

    //响应行
    $response = array(
        \'HTTP/1.1 200\',
    );
    //响应头
    $headers = array(
        \'Server\'=>\'SwooleServer\',
        \'Content-Type\'=>\'text/html;charset=utf8\',
        \'Content-Length\'=>strlen($res_data),
    );
    foreach($headers as $key=>$val){
        $response[] = $key.\':\'.$val;
    }
    //空行
    $response[] = \'\';
    //响应体
    $response[] = $res_data;
    $send_data = join("\\r\\n",$response);
    $serv->send($fd, $send_data);
}

function formatRequest($serv, $fd, $data)
{
    $tmp_data = explode("\\r\\n", $data);
    if (!is_array($tmp_data) || empty($tmp_data)) return false;
    $request_info = explode(" ", $tmp_data[0]);
    if (!is_array($request_info) || empty($request_info)) return false;

    switch ($request_info[0]) {
        case \'GET\':
            $tmp_str = urldecode($request_info[1]);
            $query_info = parse_url($tmp_str);
            $query = $query_info[\'query\'];
            $path = $query_info[\'path\'];
            global $_GET;
            parse_str($query, $_GET);
            response($serv, $fd, json_encode($_GET));
            break;
        case \'POST\':
            //needs some code
            break;
        default:
            return false;
            break;
    }
}


function urlRouter()
{

}

/*
 * 注册全局的变量POST参数
 * 注册全局的变量GET参数
 */
function register_global_request_var($data, $type)
{
    return false;
}















本文参考:

  1. swoole使用
  2. 理解RESTful架构
  3. PHP实现基于Swoole简单的HTTP服务器

以上是关于使用Swoole 构建API接口服务的主要内容,如果未能解决你的问题,请参考以下文章

构建微服务-使用OAuth 2.0保护API接口

Express实战 - 应用案例- realworld-API - 路由设计 - mongoose - 数据验证 - 密码加密 - 登录接口 - 身份认证 - token - 增删改查API(代码片段

基于 Swoole 搭建 WebSocket 服务详解

如何在 JSON 中为 v3 YouTube API 上传构建片段和状态

Swoole实验室:5-使用Systemctl管理Swoole服务

Flask 编写http接口api及接口自动化测试