第一章 APP 接口简介
什么是 app 接口? app 接口就是用服务端程序如 php 写好的脚本, 以供 app 客户端请求而获得数据的一个东西. 比如一个视频 app 的首页, 肯定有一些视频列表, 那么当你打开这个 app 时, 这个封装在 app 里的这个首页其实会去请求一个远程 php 文件如: http://www.example.com/index.php 去获得需要展示在首页的视频列表数据. 前段工程师拿到这些数据, 就会按照特定的设计, 将这些内容展示出来了.
接口要实现的目的就是这样. 一个 app 内部通常需要访问多个 php 接口来获得不同的数据. 下面具体讲一讲接口实现的流程以及实现接口需要的一些核心的技术.
第 2 章 封装通信接口方法
在正式的进入 app 接口学习之前, 我们来回顾一下 Php 的接口知识, 看下面代码:
- interface.php
- <?php
- /**
- *@description php 接口回顾
- *@author doubi
- *@date 2015/07/19
- */
- interface People{public function say();
- public function dance();
- }
- interface Animal{
- public function bite();
- }
- class Man implements People{
- public function say(){
- echo 'i can say';
- }
- public function dance(){
- echo 'i can dance';
- }
- }
- class Woman implements People{
- public function say(){
- echo 'i can say girl voice';
- }
- public function dance(){
- echo 'i can dance like a goose';
- }
- }
- class Bird implements Animal{
- public function bite(){
- echo 'i can bite';
- }
- }
- class Hybreed implements People,Animal{
- public function say(){
- echo 'i can say';
- }
- public function dance(){
- echo 'i can dance';
- }
- public function bite(){
- echo 'i can bite';
- }
- }
- $hybreed = new Hybreed;
- echo $hybreed->say()."\r\n";
- echo $hybreed->dance()."\r\n";
- echo $hybreed->bite()."\r\n";
接口存在的意义就是实现 "多重继承", 准确的来说应该就做 "多重实现", 因为一个 php 类只能有一个父类, 而一个类却可以实现多个接口, 就像上面代码 interface.php 中的 Hybreed 类, 即实现了 people 接口, 又实现了 Animal 接口, 而通过这种多重继承, 最终的 $hybreed 即获得了人类的 say 和 dance 的方法, 又获得了动物的 bite 方法. 而 Man 类和 Woman 类分别实现 People 的接口, 采用不同的内容去重写了 say 和 dance 方法, 正是一种多态的体现.
现在主流的通信接口返回的数据主要有 JSON 和 XML 两种格式. 这两种格式各有优缺点. JSON 的优势是生成方便, 体积小, 更便于传输, 缺点是不便于阅读. 而 XML 的优点是便于阅读, 但是体积大, 生成较 JSON 要麻烦的多.
2-1 JSON 方式封装通信接口 (14:39)
先上代码:
- response.class.php
- <?php
- /**
- *description 用于返回指定数据格式的类
- *@param $code [int] 返回的状态码
- *@param $message [string] 返回的状态信息
- *@param $data [array] 需要返回的数据
- *
- */
- class Response{
- public function json($code,$message,$data){
- $result = array(
- "code" => $code,
- "message" => $message,
- "data" => $data
- );
- return json_encode($result);
- }
- }
response.class.php 是一个最简单的返回 json 格式数据的类, 在下面的课程中我们会进一步对其进行完善.
下面贴出接口文件代码:
- returndata.php
- <?php
- require "response.class.php"; // 引入返回信息类
- // 准备返回数据
- $code = 200;
- $message = "信息请求成功";
- $data = array(
- "name" => "ruanwnewu",
- "sex" => "1",
- "age" => "28",
- "exp" => array(
- "2012" => "北京瑞泰新",
- "2013" => "兄弟连",
- "2014" => "木蚂蚁科技"
- )
- );
- // 实例化 response 类
- $response = new Response;
- // 返回数据
- echo $response -> json($code,$message,$data);
请求 returndata.php 接口返回的数据如下图所示:
这样就完成了一个最基本的, 封装好的 json 数据通信接口.
2-2 PHP 生成 XML 数据 (12:02)
生成 XML 格式数据一般有三种方法:
拼接字符串
- domDocument
- simpleXML
在这里我只讲解第一种方法生成 XML 数据的方法. 上代码:
- producexml.php
- <?php
- header('Content-Type:text/xml');
- $xml = '<?xml version="1.0"encoding="utf-8"?>';
- $xml .= '<res>';
- $xml .= '<code>404</code>'."\r\n";
- $xml .= '<message> 数据返回成功 </message>'."\r\n";
- $xml .= '<data>'."\r\n";
- $xml .= '<name> 软文无 </name>'."\r\n";
- $xml .= '<sex>1</sex>'."\r\n";
- $xml .= '<age>28</age>'."\r\n";
- $xml .= '</data>';
- $xml .= '</res>';
- echo $xml;
2-3 XML 方式封装通信接口 (17:50)
上代码:
- <?php
- /**
- *description 用于返回指定数据格式的类
- *@param $code [int] 返回的状态码
- *@param $message [string] 返回的状态信息
- *@param $data [array] 需要返回的数据
- */
- class Response{
- public function json($code,$message,$data){
- $result = array(
- "code" => $code,
- "message" => $message,
- "data" => $data
- );
- return json_encode($result);
- }
- public function xml($code,$message,$data){
- $result = array(
- "code" => $code,
- "message" => $message,
- "data" => $data
- );
- header('Content-Type:text/xml');
- $xml = "<?xml version='1.0'encoding='UTF-8'?>\n";
- $xml .= "<root>";
- $xml .= self::encodeXml($result);
- $xml .= "</root>";
- return $xml;
- }
- /**
- * 将数据解析为 XML 字符串
- */
- public static function encodeXml($data){
- $attr = $xml = "";
- foreach($data as $key => $value){
- if(is_numeric($key)){
- $attr = "id='{$key}'";
- $key = "item";
- }
- $xml .= "<{$key}{$attr}>";
- $xml .= is_array($value)?self::encodeXml($value):$value;
- $xml .= "</$key>";
- }
- return $xml;
- }
- }
同样用 returndata.php 调用该接口:
- <?php
- require "response.class.php"; // 引入返回信息类
- // 准备返回数据
- $code = 200;
- $message = "信息请求成功";
- $data = array(
- "name" => "ruanwnewu",
- "sex" => "1",
- "age" => "28",
- "exp" => array(
- "2012" => "北京瑞泰新",
- "2013" => "兄弟连",
- "2014" => "木蚂蚁科技"
- )
- );
- // 实例化 response 类
- $response = new Response;
- // 返回数据
- echo $response -> xml($code,$message,$data);
得到如下图所示的 XML 文件结果
2-4 综合方式封装通信数据方法 (11:15)
将两种封装方法综合起来, 并能够根据请求的参数来返回指定格式的数据, 上代码:
完善后的 response 类
- <?php
- /**
- *description 用于返回指定数据格式的类
- *@param $code [int] 返回的状态码
- *@param $message [string] 返回的状态信息
- *@param $data [array] 需要返回的数据
- */
- class Response{
- public function show($code,$message,$data,$type="json"){
- if($type == "json"){
- $this->json($code,$message,$data);
- }else{
- $this->xml($code,$message,$data);
- }
- }
- public function json($code,$message,$data){
- $result = array(
- "code" => $code,
- "message" => $message,
- "data" => $data
- );
- return json_encode($result);
- }
- public function xml($code,$message,$data){
- $result = array(
- "code" => $code,
- "message" => $message,
- "data" => $data
- );
- header('Content-Type:text/xml');
- $xml = "<?xml version='1.0'encoding='UTF-8'?>\n";
- $xml .= "<root>";
- $xml .= self::encodeXml($result);
- $xml .= "</root>";
- return $xml;
- }
- /**
- * 将数据解析为 XML 字符串
- */
- public static function encodeXml($data){
- $attr = $xml = "";
- foreach($data as $key => $value){
- if(is_numeric($key)){
- $attr = "id='{$key}'";
- $key = "item";
- }
- $xml .= "<{$key}{$attr}>";
- $xml .= is_array($value)?self::encodeXml($value):$value;
- $xml .= "</$key>";
- }
- return $xml;
- }
- }
人生就如一列永不停止的列车, no one knows when or where to stop. 总有那些美好, 值得永远怀念. 也总有那些希望, 值得你无怨无悔的付出, 追逐. 去年年底带着女儿一起坐火车会湖北老家, 她在火车上, 三岁的样子, 活泼, 调皮, 可爱的样子, 永远停在那儿, 不会有一样的了吧. cherish this memory forever.
现在 app 这么火, 作为一个 phper, 应该知道如何写 app 的接口, 下面做一个讲解.
Index:
第 1 章 APP 接口简介
-
第 2 章 封装通信接口方法
2-1 JSON 方式封装通信接口 (14:39)
2-2 PHP 生成 XML 数据 (12:02)
2-3 XML 方式封装通信接口 (17:50)
2-4 综合方式封装通信数据方法 (11:15)
-
第 3 章 核心技术
3-1 静态缓存 (17:16)
3-2 Memcache 和 Redis 缓存技术 (24:07)
3-3 定时任务 (16:46)
-
第 4 章 APP 接口实例
4-1 单例模式连接数据库 (18:29)
4-2 首页 APP 接口开发之方案一 (上) (15:49)
4-3 首页 APP 接口开发之方案一 (下) (11:03)
4-4 读取缓存方式开发首页接口 (19:21)
4-5 定时读取缓存方式开发首页接口 (16:32)
最近学习
4-6 版本升级分析及数据表设计 (08:15)
4-7 版本升级接口开发及演示 (上) (19:26)
4-8 版本升级接口开发及演示 (下) (09:29)
4-9 APP 错误日志接口 (13:22)
第一章 APP 接口简介
什么是 app 接口? app 接口就是用服务端程序如 php 写好的脚本, 以供 app 客户端请求而获得数据的一个东西. 比如一个视频 app 的首页, 肯定有一些视频列表, 那么当你打开这个 app 时, 这个封装在 app 里的这个首页其实会去请求一个远程 php 文件如: http://www.example.com/index.php 去获得需要展示在首页的视频列表数据. 前段工程师拿到这些数据, 就会按照特定的设计, 将这些内容展示出来了.
接口要实现的目的就是这样. 一个 app 内部通常需要访问多个 php 接口来获得不同的数据. 下面具体讲一讲接口实现的流程以及实现接口需要的一些核心的技术.
第 2 章 封装通信接口方法
在正式的进入 app 接口学习之前, 我们来回顾一下 Php 的接口知识, 看下面代码:
- interface.php
- <?php
- /**
- *@description php 接口回顾
- *@author doubi
- *@date 2015/07/19
- */
- interface People{
- public function say();
- public function dance();
- }
- interface Animal{
- public function bite();
- }
- class Man implements People{
- public function say(){
- echo 'i can say';
- }
- public function dance(){
- echo 'i can dance';
- }
- }
- class Woman implements People{
- public function say(){
- echo 'i can say girl voice';
- }
- public function dance(){
- echo 'i can dance like a goose';
- }
- }
- class Bird implements Animal{
- public function bite(){
- echo 'i can bite';
- }
- }
- class Hybreed implements People,Animal{
- public function say(){
- echo 'i can say';
- }
- public function dance(){
- echo 'i can dance';
- }
- public function bite(){
- echo 'i can bite';
- }
- }
- $hybreed = new Hybreed;
- echo $hybreed->say()."\r\n";
- echo $hybreed->dance()."\r\n";
- echo $hybreed->bite()."\r\n";
接口存在的意义就是实现 "多重继承", 准确的来说应该就做 "多重实现", 因为一个 php 类只能有一个父类, 而一个类却可以实现多个接口, 就像上面代码 interface.php 中的 Hybreed 类, 即实现了 people 接口, 又实现了 Animal 接口, 而通过这种多重继承, 最终的 $hybreed 即获得了人类的 say 和 dance 的方法, 又获得了动物的 bite 方法. 而 Man 类和 Woman 类分别实现 People 的接口, 采用不同的内容去重写了 say 和 dance 方法, 正是一种多态的体现.
现在主流的通信接口返回的数据主要有 JSON 和 XML 两种格式. 这两种格式各有优缺点. JSON 的优势是生成方便, 体积小, 更便于传输, 缺点是不便于阅读. 而 XML 的优点是便于阅读, 但是体积大, 生成较 JSON 要麻烦的多.
2-1 JSON 方式封装通信接口 (14:39)
先上代码:
- response.class.php
- <?php
- /**
- *description 用于返回指定数据格式的类
- *@param $code [int] 返回的状态码
- *@param $message [string] 返回的状态信息
- *@param $data [array] 需要返回的数据
- *
- */
- class Response{
- public function json($code,$message,$data){
- $result = array(
- "code" => $code,
- "message" => $message,
- "data" => $data
- );
- return json_encode($result);
- }
- }
response.class.php 是一个最简单的返回 json 格式数据的类, 在下面的课程中我们会进一步对其进行完善.
下面贴出接口文件代码:
- returndata.php
- <?php
- require "response.class.php"; // 引入返回信息类
- // 准备返回数据
- $code = 200;
- $message = "信息请求成功";
- $data = array(
- "name" => "ruanwnewu",
- "sex" => "1",
- "age" => "28",
- "exp" => array(
- "2012" => "北京瑞泰新",
- "2013" => "兄弟连",
- "2014" => "木蚂蚁科技"
- )
- );
- // 实例化 response 类
- $response = new Response;
- // 返回数据
- echo $response -> json($code,$message,$data);
请求 returndata.php 接口返回的数据如下图所示:
这样就完成了一个最基本的, 封装好的 json 数据通信接口.
2-2 PHP 生成 XML 数据 (12:02)
生成 XML 格式数据一般有三种方法:
拼接字符串
- domDocument
- simpleXML
在这里我只讲解第一种方法生成 XML 数据的方法. 上代码:
- producexml.php
- <?php
- header('Content-Type:text/xml');
- $xml = '<?xml version="1.0"encoding="utf-8"?>';
- $xml .= '<res>';
- $xml .= '<code>404</code>'."\r\n";
- $xml .= '<message> 数据返回成功 </message>'."\r\n";
- $xml .= '<data>'."\r\n";
- $xml .= '<name> 软文无 </name>'."\r\n";
- $xml .= '<sex>1</sex>'."\r\n";
- $xml .= '<age>28</age>'."\r\n";
- $xml .= '</data>';
- $xml .= '</res>';
- echo $xml;
2-3 XML 方式封装通信接口 (17:50)
上代码:
- <?php
- /**
- *description 用于返回指定数据格式的类
- *@param $code [int] 返回的状态码
- *@param $message [string] 返回的状态信息
- *@param $data [array] 需要返回的数据
- */
- class Response{
- public function json($code,$message,$data){
- $result = array(
- "code" => $code,
- "message" => $message,
- "data" => $data
- );
- return json_encode($result);
- }
- public function xml($code,$message,$data){
- $result = array(
- "code" => $code,
- "message" => $message,
- "data" => $data
- );
- header('Content-Type:text/xml');
- $xml = "<?xml version='1.0'encoding='UTF-8'?>\n";
- $xml .= "<root>";
- $xml .= self::encodeXml($result);
- $xml .= "</root>";
- return $xml;
- }
- /**
- * 将数据解析为 XML 字符串
- */
- public static function encodeXml($data){
- $attr = $xml = "";
- foreach($data as $key => $value){
- if(is_numeric($key)){
- $attr = "id='{$key}'";
- $key = "item";
- }
- $xml .= "<{$key}{$attr}>";
- $xml .= is_array($value)?self::encodeXml($value):$value;
- $xml .= "</$key>";
- }
- return $xml;
- }
- }
同样用 returndata.php 调用该接口:
- <?php
- require "response.class.php"; // 引入返回信息类
- // 准备返回数据
- $code = 200;
- $message = "信息请求成功";
- $data = array(
- "name" => "ruanwnewu",
- "sex" => "1",
- "age" => "28",
- "exp" => array(
- "2012" => "北京瑞泰新",
- "2013" => "兄弟连",
- "2014" => "木蚂蚁科技"
- )
- );
- // 实例化 response 类
- $response = new Response;
- // 返回数据
- echo $response -> xml($code,$message,$data);
得到如下图所示的 XML 文件结果
2-4 综合方式封装通信数据方法 (11:15)
将两种封装方法综合起来, 并能够根据请求的参数来返回指定格式的数据, 上代码:
完善后的 response 类
- <?php
- /**
- *description 用于返回指定数据格式的类
- *@param $code [int] 返回的状态码
- *@param $message [string] 返回的状态信息
- *@param $data [array] 需要返回的数据
- */
- class Response{
- public function show($code,$message,$data,$type="json"){
- if($type == "json"){
- $this->json($code,$message,$data);
- }else{
- $this->xml($code,$message,$data);
- }
- }
- public function json($code,$message,$data){
- $result = array(
- "code" => $code,
- "message" => $message,
- "data" => $data
- );
- return json_encode($result);
- }
- public function xml($code,$message,$data){
- $result = array(
- "code" => $code,
- "message" => $message,
- "data" => $data
- );
- header('Content-Type:text/xml');
- $xml = "<?xml version='1.0'encoding='UTF-8'?".">\n";
- $xml .= "<root>";
- $xml .= self::encodeXml($result);
- $xml .= "</root>";
- return $xml;
- }
- /**
- * 将数据解析为 XML 字符串
- */
- public static function encodeXml($data){
- $attr = $xml = "";
- foreach($data as $key => $value){
- if(is_numeric($key)){
- $attr = "id='{$key}'";
- $key = "item";
- }
- $xml .= "<{$key}{$attr}>";
- $xml .= is_array($value)?self::encodeXml($value):$value;
- $xml .= "</$key>";
- }
- return $xml;
- }
- }
来源: http://www.jianshu.com/p/6c4edd0c432c