前一章,我们对接口参数基本定义做了一个简要说明。里面提到了几个示例接口,接下来,我们就来讲解这个几点个示例接口的具体实现。

「PHP开发APP接口实战004」基础响应参数说明

前言

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

知识点及参考资料

Output类的实现

Output 类主要用于将结果转换成对应接口数据,并输出到页面上。

Output 类采用了单例设计模式。什么是单例模式,这里我就不展开讲了,有兴趣的同学可以点开前面的参考资料,进行进一步的了解。

我们在 /app/library 目录下创建 Output.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的实例对象。

定义私有变量$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;

}

}

定义私有变量$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)

添加以下代码,实现输出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数据解析时,更为方便的进行数据类型转换。

根据状态可分为成功和失败两种接口。所以,我们添加 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('登录失败')

还有一个特殊的输出方法, 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 完整代码

/**

* 输出数据

*/

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;

}

}

php app接口开发,「PHP开发APP接口实战005」基础示例接口的实现一相关推荐

  1. ajax调用外域接口不进回调函数_网易实战分享云信IM SDK接口设计实践

    文|陈吉力 网易智慧企业高级Android开发工程师 对外接口的设计准则 SDK对外提供接口设计的基本原则是易用,易懂,易扩展,易监控.展开来可归纳为以下几个特性: 1. API按照业务功能分类,但所 ...

  2. vscode php插件_「PHP从入门到颈椎病康复」基础篇——HelloWorld

    需要的前驱知识 在学习这篇文章之前,需要有一点HTML的基础,需要的小伙伴可以点开我的主页,查看<「HTML从入门到颈椎病康复」>系列文章. 啥玩意是php PHP:"超文本预处 ...

  3. android+驾考软件开发,「驾考app开发」驾考app开发解决方案

    我们都知道想要驾驶机动车,那么就必须要有驾照.而驾照的获取没有任何的便捷途径,只有通过正规的驾校培训与通过驾照考试才能获取.随着驾考的项目越来越多,难度越来越大, 人们对于驾照的取得变得越来越没有信心 ...

  4. 接口响应时组装响应json_企业实战之spring项目《接口响应体格式统一封装》

    前言 在之前的文章中我们有介绍过,如何更好.更简单的写好一个接口(接口返回值篇),今天的这篇文章我们主要介绍,怎么统一处理下接口的返回格式问题. 问题分析 我们先来分析下我们所面临的问题在哪里,然后接 ...

  5. .net mysql sqlhelper_「谢灿asp.net三层架构」5、DAL中公共类-SqlHelper类应该这样写

    <谢灿asp.net三层架构>系列教程由小灿灿IT首发百度平台,希望对各位喜欢计算机的同学有所帮助!关注+分享+评论+点赞,是对我们最好的支持!有了您的支持,我们坚信我们会做得更好! 在C ...

  6. 开发安卓app游戏_「安卓APP开发流程」安卓APP如何开发的?

    21世纪,智能手机走进了人们的生活,现在的智能手机的操作系统基本分为两种,一种是IOS系统(苹果系统).安卓系统,其中,安卓系统是开源的,所以很多品牌商会讲安卓包装成自己的系统,但核心还是一样的,都是 ...

  7. Thinkphp 6 + Vue 2 + ElementUI + Vxe-table 前后端分离的,一键生成代码和API接口的,通用后台管理系统 快速开发框架,开发小程序和APP的推荐框架!

    Thinkphp 6 + Vue 2 + ElementUI + Vxe-table 前后端分离的,一键生成代码和API接口的,通用后台管理系统 快速开发框架,开发小程序和APP的推荐框架! 概述 R ...

  8. 魔方APP项目-01-移动端开发相关概念、移动端自适配、元信息(meta)、开发准备、移动端项目搭建(模拟器调试)、APICloud(APICloud 前端框架,获取服务端API接口)

    一.移动端开发相关概念 1.APP类型 ①.Native APP Native APP又称原生APP,就是我们平时说的手机应用软件. 原生APP 是针对IOS.Android.Windows等不同的手 ...

  9. PHP开发APP接口(六):APP版本升级以及APP演示

    一.版本升级分析及数据表设计 学习要点: 1. 版本升级分析 2. 掌握如何设计版本升级数据表 Web升级:由开发工程师进行代码的修改上传的操作: App更新:由用户自行更新版本: 初始化接口 ini ...

最新文章

  1. 温故而知新,ggplot2 饼图的几点笔记
  2. 实例讲解《Microsoft AJAX Library》(2):DomEvent类
  3. PG SQL数据库读写分离的思路
  4. 搭建LVS_DR模型
  5. mac下natapp使用
  6. Sql语句中IN和exists的区别及应用
  7. Python编写杨辉三角形
  8. cairo填充_Cairo图形指南
  9. 【python】查找array中非零元素的横纵坐标
  10. 男人很容易喜欢一个女人,却不轻易深爱一个女人。
  11. Cannot connect to the Maven process.Try again later.If the problem persists...
  12. valgrind详细说明
  13. 特斯拉前高管:马斯克发推特之前 很多员工就已知晓私有化计划
  14. Developing a new LMS function
  15. 网盘行业No1 金山快盘个人版推出永久免费100G空间
  16. 天脉导热冲刺创业板:拟募资4亿 创始人谢毅是初中学历
  17. uniCloud杂文
  18. 使用EA交易应该注意哪些问题?
  19. java工具类之大文件分片(切割)与合并
  20. qt mysql 不能创建表_Qt 数据库创建表失败原因之数据库关键字

热门文章

  1. 允许或禁止未知来源apk的安装
  2. react 父组件调用子组件方法--通过 props 实现
  3. 2020 icpc济南 A - Matrix Equation (高斯消元求自由元个数)
  4. 记一次个人服务器被nicehash挖矿,排查挖矿程序记录
  5. 【Designing ML Systems】第 7 章 :模型部署和预测服务
  6. 盗取QQ密码的顽固的IEXPLORE.EXE病毒
  7. 来自#Devoxx 2014的WebSocket螺母和螺栓的幻灯片
  8. signal函数详细用法
  9. 小旋风万能蜘蛛池x9.02开心版/站长必备SEO/永久使用/带教程
  10. python编写交互界面查分,Python实现CET查分的方法