zoukankan      html  css  js  c++  java
  • 使用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("
    ",$response);
        $serv->send($fd, $send_data);
    }
    
    function formatRequest($serv, $fd, $data)
    {
        $tmp_data = explode("
    ", $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服务器
  • 相关阅读:
    MVVM架构~knockoutjs系列之表单添加(验证)与列表操作源码开放
    MVVM架构~knockoutjs系列之验证成功提示显示
    MVVM架构~knockoutjs系列之正则表达式使规则更灵活
    郁闷~win7无法进行局域网访问解决
    不合规范的html段落php处理细则
    备份一个通过拷贝来创建虚拟机镜像的脚本
    [置顶] ffmpg简介以及用它实现音频视频合并(java)
    [Java] HttpClient有个古怪的stalecheck选项
    POJ 1260 Pearls
    “AIR SDK 0.0: AIR SDK location “...devsdksAIRSDKWin” does not exist.”问题解决~
  • 原文地址:https://www.cnblogs.com/roverliang/p/8380015.html
Copyright © 2011-2022 走看看