浅谈使用 PHP 进行手机 APP 开发(API 接口开发)


Posted in PHP onAugust 11, 2014

一、先简单回答两个问题:

1、PHP 可以开发客户端?

答:可以,因为PHP是脚本语言,是负责完成 B/S架构 或 C/S架构 的S部分,即:主要用于服务端的开发。但是,PHP可不仅仅只能在互联网站上发展,一个PHP for Android(PFA)站点表示他们将可以发布编程模型、工具盒文档让PHP在Android上实现应用。该项目的主要赞助商是开源公司IronTec,PFA使用Scripting Layer for Android (SL4A),也就是Androd Scripting Environment(ASE)来实现这一点,您可以参看他们的网站来了解更多技术内幕。

如果有兴趣你可以参考一些相关的技术文档,比如:http://so.3water.com/cse/search?q=php+for+android&s=10520733385329581432

2、为什么选择 PHP 作为开发服务端的首选?

答:跨平台(可以运行在UNIX、LINUX、WINDOWS、Mac OS下)、低消耗(PHP消耗相当少的系统资源)、运行效率高(相对而言)、MySQL的完美搭档,本身是免费开源的,......

二、如何使用 PHP 开发 API(Application Programming Interface,应用程序编程接口) 呢?

做过 API 的人应该了解,其实开发 API 比开发 WEB 更简洁,但可能逻辑更复杂,因为 API 其实就是数据输出,不用呈现页面,所以也就不存在 MVC(API 只有 M 和 C),

1、和 WEB 开发一样,首先需要一些相关的参数,这些参数,都会由客户端传过来,也许是 GET 也许是 POST,这个需要开发团队相互之间约定好,或者制定统一规范。

2、有了参数,根据应用需求,完成数据处理,例如:任务进度更新、APP内购、一局游戏结束数据提交等等

3、数据逻辑处理完之后,返回客户端所需要用到的相关数据,例如:任务状态、内购结果、玩家信息等等

数据怎么返给客户端?

直接输出的形式,如:JSON、XML、TEXT 等等。

4、客户端获取到你返回的数据后,在客户端本地和用户进行交互

临时写的一个简单 API 例子:

<?php
  $output = array();
  $a = @$_GET['a'] ? $_GET['a'] : '';
  $uid = @$_GET['uid'] ? $_GET['uid'] : 0;
  if (empty($a)) {
   $output = array('data'=>NULL, 'info'=>'坑爹啊!', 'code'=>-201);
   exit(json_encode($output));
   }
   
 //走接口
  if ($a == 'get_users') {
   //检查用户
   if ($uid == 0) {
     $output = array('data'=>NULL, 'info'=>'The uid is null!', 'code'=>-401);
      exit(json_encode($output));
   }
   //假设 $mysql 是数据库
  $mysql = array(
   10001 => array(
     'uid'=>10001,
     'vip'=>5,
     'nickname' => 'Shine X',
     'email'=>'979137@qq.com',
     'qq'=>979137,
     'gold'=>1500,
     'powerplay'=> array('2xp'=>12,'gem'=>12,'bingo'=>5,'keys'=>5,'chest'=>8),
     'gems'=> array('red'=>13,'green'=>3,'blue'=>8,'yellow'=>17),
     'ctime'=>1376523234,
     'lastLogin'=>1377123144,
     'level'=>19,
     'exp'=>16758,
      ),
     10002 => array(
      'uid'=>10002,
      'vip'=>50,
      'nickname' => 'elva',
      'email'=>'elva@ezhi.net',
      'qq'=>NULL,
      'gold'=>14320,
      'powerplay'=> array('2xp'=>1,'gem'=>120,'bingo'=>51,'keys'=>5,'chest'=>8),
      'gems'=> array('red'=>13,'green'=>3,'blue'=>8,'yellow'=>17),
      'ctime'=>1376523234,
      'lastLogin'=>1377123144,
      'level'=>112,
      'exp'=>167588,
      ),
     10003 => array(
      'uid' => 10003,
      'vip' => 5,
      'nickname' => 'Lily',
      'email' => 'Lily@ezhi.net',
      'qq' => NULL,
      'gold' => 1541,
      'powerplay'=> array('2xp'=>2,'gem'=>112,'bingo'=>4,'keys'=>7,'chest'=>8),
      'gems' => array('red'=>13,'green'=>3,'blue'=>9,'yellow'=>7),
      'ctime' => 1376523234,
      'lastLogin'=> 1377123144,
      'level' => 10,
      'exp' => 1758,
        ),
       );
       $uidArr = array(10001,10002,10003);
       if (in_array($uid, $uidArr, true)) {
        $output = array('data' => NULL, 'info'=>'The user does not exist!', 'code' => -402);
        exit(json_encode($output));
       }
   
       //查询数据库
       $userInfo = $mysql[$uid];
       //输出数据
       $output = array(
        'data' => array(
        'userInfo' => $userInfo,
        'isLogin' => true,//是否首次登陆
        'unread' => 4,//未读消息数量
        'untask' => 3,//未完成任务
        ), 
      'info' => 'Here is the message which, commonly used in popup window', //消息提示,客户端常会用此作为给弹窗信息。
      'code' => 200, //成功与失败的代码,一般都是正数或者负数
        );
       exit(json_encode($output));
    } elseif ($a == 'get_games_result') {
    
       //... 
       die('您正在调 get_games_result 接口!'); 
      } elseif ($a == 'upload_avatars') { 
       //.... 
       die('您正在调 upload_avatars 接口!');
    
      }

点击测试(对于客户端而言,也是直接调用这样的地址):

http://www.ezhi.net/api/test/index.php

http://www.ezhi.net/api/test/index.php?a=get_users

http://www.ezhi.net/api/test/index.php?a=get_users&uid=10001

http://www.ezhi.net/api/test/index.php?a=get_users&uid=10002

http://www.ezhi.net/api/test/index.php?a=get_users&uid=10003

三、实际项目中,我们在开发 API 应该注意的几个事项(仅供参考):

1、单文件实现多接口的形式有很多种,例如:if..elseif.. 或 switch 或 动态方法 (也就是TP的这种访问函数体的形式)

2、对于数据的输出最好用json,json具有相当强大的跨平台性,市场上各大主流编程语言都支持json解析,json正在逐步取代xml,成为网络数据的通用格式

3、接口安全,一定要增加接口验证。例如,客户端和服务端针对不同接口统一做好加密方式,服务端在对于每次接口需要都要进行验证。以保证防止接口被恶意刷新或黑客恶意调用,尤其是大型商业应用。

4、对于线上的 API 必须保证所有接口正常且关闭所有的错误信息 => error_reporting(0),在输出JSON 时,不能有任何其它输出,否则,客户端将会获取错误的数据信息,98%直接导致客户端 Crash!

5、开发 API 和 WEB 有一定的区别,如果是 WEB 的话,可能代码出错了,不会导致特别严重的错误,也许只是导致数据写入和查询失败,也许导致 WEB 的某个部分错位或乱码。但如果是 API,99%的情况都是客户端直接Crash、闪退!

6、做接口开发,不建议使用框架开发,原因概括起来有两点(其实我有点冒风险的,本人也是 TPer 一枚,毕竟这是TP的官网):

客户端一般对服务端的响应速度有极高要求,因此,使用最原生态的 PHP完成接口开发,是最高效的,假如用到了框架,还需要加载各种不需要多余的文件,就好比夏天穿了件冬天的衣服。试想,你在玩手机的时候,使用一个应用随便一个操作,等半天才有动静,你受的了吗?
就是上面第4点提到的,框架对于WEB开发,是件很幸福的事,但对于 API 而言,你实在不敢想象它会给你出什么岔子!最后你将痛苦不堪~~因为很多框架都是为 WEB 诞生的(我也很期待有一天能看到专门为开发 API 而生的框架或者扩展)
说到这,不得不说扯一下,风靡互联网的开放平台。其实那些开放平台,所谓的开放,就是给你提供一个这样的接口,你根据他们提供的技术文档,按他们制定的格式和要求,调它们提供的接口文件(一般都是返回JSON或者XML),你就可以获取到他们的相关信息,例如:QQ用户基本信息、淘宝店铺、商品消息等等。然后在根据这些消息,在你的应用里完成交互。

其实,ajax 也是调用 API 的一种体现形式,你觉得呢? 呵呵~~

PHP 相关文章推荐
发款php蜘蛛统计插件只要有mysql就可用
Oct 12 PHP
smarty模板中拼接字符串的方法
Feb 14 PHP
教你如何在CI框架中使用 .htaccess 隐藏url中index.php
Jun 09 PHP
Yii2使用小技巧之通过 Composer 添加 FontAwesome 字体资源
Jun 22 PHP
ThinkPHP模板判断输出Defined标签用法详解
Jun 30 PHP
thinkphp模板输出技巧汇总
Nov 24 PHP
php+jQuery.uploadify实现文件上传教程
Dec 26 PHP
php求一个网段开始与结束IP地址的方法
Jul 09 PHP
PHP之浮点数计算比较以及取整数不准确的解决办法
Jul 29 PHP
PHP中strpos、strstr和stripos、stristr函数分析
Jun 11 PHP
PHP类和对象相关系统函数与运算符小结
Sep 28 PHP
php下载文件超时时间的设置方法
Oct 06 PHP
Parse正式发布开源PHP SDK
Aug 11 #PHP
Php连接及读取和写入mysql数据库的常用代码
Aug 11 #PHP
Zend Framework 2.0事件管理器(The EventManager)入门教程
Aug 11 #PHP
php向js函数传参的几种方法
Aug 10 #PHP
本地计算机无法启动Apache故障处理
Aug 08 #PHP
浅析PHP编程中10个最常见的错误
Aug 08 #PHP
ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法
Aug 08 #PHP
You might like
通过修改Laravel Auth使用salt和password进行认证用户详解
2017/08/17 PHP
PHP实现普通hash分布式算法简单示例
2018/08/06 PHP
PHP封装的mysqli数据库操作类示例
2019/02/16 PHP
许愿墙中用到的函数
2006/10/07 Javascript
使用EXT实现无刷新动态调用股票信息
2008/11/01 Javascript
ExtJS扩展 垂直tabLayout实现代码
2009/06/21 Javascript
javascript倒计时功能实现代码
2012/06/07 Javascript
javascript 原型链维护和继承详解
2014/11/26 Javascript
AngularJS基础 ng-submit 指令简单示例
2016/08/03 Javascript
使用Bootstrap Tabs选项卡Ajax加载数据实现
2016/12/23 Javascript
Javascript封装id、class与元素选择器方法示例
2017/03/13 Javascript
vue.js事件处理器是什么
2017/03/20 Javascript
微信小程序之购物车功能
2020/09/23 Javascript
React-Native左右联动List的示例代码
2017/09/21 Javascript
vue-router路由懒加载和权限控制详解
2017/12/13 Javascript
Javascript中prototype与__proto__的关系详解
2018/03/11 Javascript
express默认日志组件morgan的方法
2018/04/05 Javascript
一文了解Vue中的nextTick
2019/05/06 Javascript
使用Easyui实现查询条件的后端传递并自动刷新表格的两种方法
2019/09/09 Javascript
js实现倒计时秒杀效果
2020/03/25 Javascript
[48:22]VGJ.S vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python函数式编程指南(四):生成器详解
2015/06/24 Python
Python字符串拼接、截取及替换方法总结分析
2016/04/13 Python
python实现简单购物商城
2016/05/21 Python
Python求解正态分布置信区间教程
2019/11/20 Python
python 经典数字滤波实例
2019/12/16 Python
python base64库给用户名或密码加密的流程
2020/01/02 Python
使用Python来做一个屏幕录制工具的操作代码
2020/01/18 Python
Python如何省略括号方法详解
2020/03/21 Python
如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度
2019/08/01 HTML / CSS
Derek Rose官网:英国高档睡衣、家居服和内衣品牌
2020/01/18 全球购物
中国梦团日活动总结
2014/07/07 职场文书
2014年自愿离婚协议书范本
2014/09/25 职场文书
2014年保卫部工作总结
2014/11/21 职场文书
2014年教师业务工作总结
2014/12/19 职场文书
走近毛泽东观后感
2015/06/04 职场文书