美文网首页PhalconPHP经验分享
「PHP开发APP接口实战005」基础示例接口的实现一

「PHP开发APP接口实战005」基础示例接口的实现一

作者: 一念觀心 | 来源:发表于2018-01-25 17:15 被阅读66次

    前一章,我们对接口参数基本定义做了一个简要说明。里面提到了几个示例接口,接下来,我们就来讲解这个几点个示例接口的具体实现。
    「PHP开发APP接口实战004」基础响应参数说明

    前言

    由于我们的接口返回数据类型包含 JSON 和 H5,所以我们选用的是 Phalcon 框架中MVC模式。

    知识点及参考资料

    Output类的实现

    Output 类主要用于将结果转换成对应接口数据,并输出到页面上。
    Output 类采用了单例设计模式。什么是单例模式,这里我就不展开讲了,有兴趣的同学可以点开前面的参考资料,进行进一步的了解。

    1. 我们在 /app/library 目录下创建 Output.php 类文件。插入下面代码:
    <?php
    
    class Output
    {
    
        // 存放实例
        public static $instance;
    
        /**
         * 私有化构造方法
         */
        private function __construct()
        {
        }
    
        /**
         * 公有化获取实例方法
         * @return Output 返回当前实例
         */
        public static function instance()
        {
            if (!self::$instance) self::$instance = new self();
            return self::$instance;
        }
    }
    

    这就是用PHP单例设计模式定义类最基本的代码。 调用方法 Output::instance()。这里只是返回了Output的实例对象。

    1. 定义私有变量$response,用于接收页面响应对象。再给构造方法 __construct 和获取实例方法 instance 分别添加参数$response,并将参数赋值给私有变量$response。调用方法变成 Output::instance($response)
    class Output
    {
    
        // 存放实例
        public static $instance;
    
        // 页面响应对象
        private $response = null;
    
        /**
         * 私有化构造方法
         * @param \Phalcon\Http\Response|null $response 传入控制器页面响应对象
         */
        private function __construct(Phalcon\Http\Response $response)
        {
            $this->response = $response;
        }
    
        /**
         * 公有化获取实例方法
         * @param \Phalcon\Http\Response $response 传入控制器页面响应对象
         * @return Output 返回当前实例
         */
        public static function instance(Phalcon\Http\Response $response)
        {
            if (!self::$instance) self::$instance = new self($response);
            return self::$instance;
        }
    }
    
    1. 定义私有变量$view,用于接收页面视图对象。 再添加一个方法 setView 用于设置视图对象。
        // 页面视图对象(用于返回H5页面)
        private $view = null;
    
        /**
         * 设置页面视图对象
         * @param \Phalcon\Mvc\View $view 传入控制器页面视图对象
         * @return $this 返回实例化对象
         */
        public function setView(Phalcon\Mvc\View $view)
        {
            $this->view = $view;
            return $this;
        }
    

    视图对象只有在返回H5页面的接口才会用到,所以非H5接口,不需要调用 setView 方法。调用方法 Output::instance($response)->setView($view)

    1. 添加以下代码,实现输出JSON数据。
        /**
         * 重写JSON格式的字符串进行编码
         * @param $data
         * @param null $options
         * @return string
         */
        private function JsonEncode($data, $options = null)
        {
            return json_encode($this->DataAsString($data), $options);
        }
    
        /**
         * 数据值强转字符串
         * @param $data
         * @return mixed
         */
        private function DataAsString($data)
        {
            $data = is_object($data) ? (array)$data : $data;
            if (is_array($data)) {
                foreach ($data as $key => $value) {
                    if (is_array($value) || is_object($value)) {
                        $data[$key] = $this->DataAsString($value);
                    } else {
                        $data[$key] = (string)$value;
                    }
                }
            }
            return $data;
        }
    
        /**
         * 输出JSON数据
         * @param $body
         */
        public function json($body)
        {
            // 设置响应内容类型 Content-Type 为 JSON类型,UTF-8编码。
            $this->response->setHeader('Content-Type', 'text/json;charset=utf-8;');
            $options = NULL;
            // 读取是否开启调试配置
            // 如果开启调试,输出JSON数据中的中文不进行 unicode 编码操作
            if (Config::instance()->get('debug')) {
                $options = $options | JSON_UNESCAPED_UNICODE; // 中文不进行 unicode 编码
            }
            // 输出JSON数据,并退出当前脚本。
            die(self::JsonEncode($body, $options));
        }
    

    上述代码主要实现:

    • 设置响应内容类型 Content-Type 为 JSON类型,UTF-8编码。
    • 读取是否开启调试配置,如果开启调试,返回输出JSON数据中的中文不进行 unicode 编码操作。如:经过编码的数据 {"status":"1","value":"\u672a\u7f16\u7801\u4e2d\u6587"},未编码的数据:{"status":"1","value":"未编码中文"}。 在开发和调试代码时,使用未编码的数据更为直观,方便审阅输出结果。为了更好的传输中文,在正式运行环境下,需要对中文进行 unicode 编码操作。
    • 将输出JSON数据中值强制转换为字符串,如: {"status":1} 换转成{"status":"1"}。 这样做的目的是为了,让在开发APP,调用接口进行JSON数据解析时,更为方便的进行数据类型转换。
    1. 根据状态可分为成功和失败两种接口。所以,我们添加 success 和 fail 两个方法,分别来实现两种状态接口的输出。
        /**
         * 输出成功数据
         * @param $data
         */
        public function success($data = '')
        {
            $body = [
                'status' => '1',
            ];
    
            if (is_object($data)) {  // 对像数据
                $body['item'] = $data;
            } elseif (is_array($data)) { // 列表数据
                $body['list'] = $data;
            } else {
                $body['value'] = $data;  // 消息(字符串)数据
            }
            $this->json($body);
        }
    

    成功接口{"status":"1"},又按数据类型分为:对像数据 ( item ) 、列表数据 ( list )、消息(字符串)数据 ( value )。
    调用方法:Output::instance($response)->success('Hello World.')

        /**
         * 输出失败数据
         * @param $message   错误消息
         * @param int $code 错误代码: 300 验证错误, 500 系统错误
         * @param string $track 错误跟踪信息: 错误代码文件路径,错误所在行等。
         */
        public function fail($message, $code = 300, $track = null)
        {
            $body = [
                'status' => '0',
                'error_code' => $code,
                'error_message' => $message,
            ];
    
            if ($track && Config::instance()->get('debug')) {
                $body['track'] = $track;
            }
            $this->json($body);
        }
    

    失败接口{"status":"0"},有固定的必填参数:error_code 错误代码、 error_message 错误消息。如果开启了调试并接收到错误跟踪信息,还会输出 track 错误跟踪信息参数。
    调用方法:Output::instance($response)->fail('登录失败')

    1. 还有一个特殊的输出方法, h5。用于输出H5页面数据。
        /**
         * 输出H5页面数据
         * @param null $data
         */
        public function h5($data = null)
        {
            // 设置响应内容类型 Content-Type 为 HTML类型,UTF-8编码。
            $this->response->setHeader('Content-Type', 'text/html;charset=utf-8;');
    
            // 将数据注册到 View, 便于在模板中读取
            $this->view->data = $data;
        }
    

    上述代码主要实现:

    • 设置响应内容类型 Content-Type 为 HTML类型,UTF-8编码。
    • 将数据注册到 View, 便于在模板中读取

    调用此方法之前必须先调用 setView 方法, 如:Output::instance($response)->setView($view)->h5('测试')

    Output.php 完整代码

    <?php
    
    /**
     * 输出数据
     */
    class Output
    {
    
        // 存放实例
        public static $instance;
    
        // 页面响应对象
        private $response = null;
    
        // 页面视图对象(用于返回H5页面)
        private $view = null;
    
        /**
         * 私有化构造方法
         * @param \Phalcon\Http\Response|null $response 传入控制器页面响应对象
         */
        private function __construct(Phalcon\Http\Response $response)
        {
            $this->response = $response;
        }
    
        /**
         * 公有化获取实例方法
         * @param \Phalcon\Http\Response $response 传入控制器页面响应对象
         * @return Output 返回当前实例
         */
        public static function instance(Phalcon\Http\Response $response)
        {
            if (!self::$instance) self::$instance = new self($response);
            return self::$instance;
        }
    
        /**
         * 设置页面视图对象
         * @param \Phalcon\Mvc\View $view 传入控制器页面视图对象
         * @return $this
         */
        public function setView(Phalcon\Mvc\View $view)
        {
            $this->view = $view;
            return $this;
        }
    
        /**
         * 重写JSON格式的字符串进行编码
         * @param $data
         * @param null $options
         * @return string
         */
        private function JsonEncode($data, $options = null)
        {
            return json_encode($this->DataAsString($data), $options);
        }
    
        /**
         * 数据值强转字符串
         * @param $data
         * @return mixed
         */
        private function DataAsString($data)
        {
            $data = is_object($data) ? (array)$data : $data;
            if (is_array($data)) {
                foreach ($data as $key => $value) {
                    if (is_array($value) || is_object($value)) {
                        $data[$key] = $this->DataAsString($value);
                    } else {
                        $data[$key] = (string)$value;
                    }
                }
            }
            return $data;
        }
    
        /**
         * 输出JSON数据
         * @param $body
         */
        public function json($body)
        {
            // 设置响应内容类型 Content-Type 为 JSON类型,UTF-8编码。
            $this->response->setHeader('Content-Type', 'text/json;charset=utf-8;');
            $options = NULL;
            // 读取是否开启调试配置
            // 如果开启调试,输出JSON数据中的中文不进行 unicode 编码操作
            if (Config::instance()->get('debug')) {
                $options = $options | JSON_UNESCAPED_UNICODE; // 中文不进行 unicode 编码
            }
            // 输出JSON数据,并退出当前脚本。
            die(self::JsonEncode($body, $options));
        }
    
        /**
         * 输出成功数据
         * @param $data
         */
        public function success($data = '')
        {
            $body = [
                'status' => '1',
            ];
    
            if (is_object($data)) {  // 对像数据
                $body['item'] = $data;
            } elseif (is_array($data)) { // 列表数据
                $body['list'] = $data;
            } else {
                $body['value'] = $data;  // 消息(字符串)数据
            }
            $this->json($body);
        }
    
        /**
         * 输出失败数据
         * @param $message   错误消息
         * @param int $code 错误代码: 300 验证错误, 500 系统错误
         * @param string $track 错误跟踪信息: 错误代码文件路径,错误所在行等。
         */
        public function fail($message, $code = 300, $track = null)
        {
            $body = [
                'status' => '0',
                'error_code' => $code,
                'error_message' => $message,
            ];
    
            if ($track && Config::instance()->get('debug')) {
                $body['track'] = $track;
            }
            $this->json($body);
        }
    
        /**
         * 输出H5页面数据
         * @param null $data
         */
        public function h5($data = null)
        {
            // 设置响应内容类型 Content-Type 为 HTML类型,UTF-8编码。
            $this->response->setHeader('Content-Type', 'text/html;charset=utf-8;');
    
            // 将数据注册到 View, 便于在模板中读取
            $this->view->data = $data;
        }
    }
    

    示例代码下载
    链接:https://pan.baidu.com/s/1ht4xA7a 密码:zjfj

    相关文章

      网友评论

        本文标题:「PHP开发APP接口实战005」基础示例接口的实现一

        本文链接:https://www.haomeiwen.com/subject/fajuaxtx.html