一、app视图与控制器

1)路由

这里的v1、v2就是模块,由于客户端版本一直在迭代的,那么一些老版本的客户端调用的接口就得保留起来,使得兼容。新版本就直接调用新接口。

还有一种是写html页面,在客户端展示,只要把template文件夹和data文件夹加上就可以了。

Controller的配置如下,注意ismodule是true,module_list中的array:

$InitPHP_conf['ismodule'] = true; //开启module方式
$InitPHP_conf['controller']['path']                  = 'controller';
$InitPHP_conf['controller']['controller_postfix']    = 'Controller'; //控制器文件后缀名
$InitPHP_conf['controller']['action_postfix']        = ''; //Action函数名称后缀
$InitPHP_conf['controller']['default_controller']    = 'index'; //默认执行的控制器名称
$InitPHP_conf['controller']['default_action']        = 'index'; //默认执行的Action函数
$InitPHP_conf['controller']['module_list']           = array('v1','v2'); //module白名单
$InitPHP_conf['controller']['default_module']        = 'v1'; //默认执行module
$InitPHP_conf['controller']['default_before_action'] = 'before'; //默认前置的ACTION名称
$InitPHP_conf['controller']['default_after_action']  = 'after'; //默认后置ACTION名称

这里顺便说下InitPHP的路由管理。InitPHP的框架URL路由分为三种形式,原生、path模式、rewrite模式,HTML模式。我这边用的是rewrite模式。

1.原生模式:index.php?c=index&a=run

2.rewrite模式:/index/run/id=1 (需要开启服务器rewrite模块,并且配置.htaccess)

3.path模式:/index/run/id/1 (需要开启服务器rewrite模块,并且配置.htaccess)

4.html模式: user-index-run.htm?uid=100 (需要开启服务器rewrite模块,并且配置.htaccess)

2)模拟session

这里模拟的方法比较简单而粗暴。

在登录的时候,会生成一串字符,然后保存到用户表中,这串字符会返回给客户端,作为session。

在登录后客户端会将这串字符传过来,服务器再根据这串字符在搜索用户,从未获取用户信息,并判断是否已经登录。

二、apiController通用控制器类

public function __construct() {parent::__construct();$this->controller_name = $this->getC();$this->action_name = $this->getA();$this->module_name = $this->getM();//访问参数日志记录$this->_logVisit();//API统一接口为post提交if (!$this->controller->is_post()) {$this->output(constHelper::API_STATUS_NEED_POST, '必须为POST请求');}/*** 请求参数示例* __ua=Android 4.4.4//MI 3W//26//2.0//865645022129866//WIFI&* __timestamp=1441854121116&* mobile=13800138000&* __version=2.0&* __device=android&type=2&* __key=67543fd413ce4d281fc93306597acb66*/$device = $this->p('__device'); //客户端名称$timestamp = $this->p('__timestamp'); //客户端时间戳$key = $this->p('__key'); //客户端加密指纹$session = $this->p('__session'); //客户端SESSION$version = substr($this->p('__version'), 0, 5); //客户端版本//客户端最低版本号要求if (strnatcmp($version, constHelper::MIN_VERSION_ALLOWED) < 0) { //客户端需要升级$this->output(constHelper::API_STATUS_NEED_UPGRADE, '客户端需要升级');}//检查密钥$this->_checkSecretKey($device, $timestamp, $key);//判断是否需要验证登录$needCheck = $this->_checkLogin();if($needCheck && empty($session)) {$this->output(constHelper::API_STATUS_NEED_LOGIN, '请先登录');}//根据session获取用户信息if(!empty($session)){$memberModel = InitPHP::getMysqlDao('member');$this->member = $memberModel->getMemberBySession($session);}//session没有获取到相关信息 也要做跳转if($needCheck && empty($this->member)) {$this->output(constHelper::API_STATUS_NEED_LOGIN, '请先登录');}
}

1)访问参数日志记录

当客户端发起一个请求的时候,会带上很多参数,例如操作系统、当前版本号、时间戳、口令、网络、应用市场等信息。

调用$this->_logVisit();将这些信息全部存到MongoDB中,便于以后调试与追踪。并且在返回参数的时候,将返回参数更新到这条请求记录中。

2)output返回参数

返回参数的格式如下:

 {"code":1000,"msg":"hello\u6210\u529f","data":{"result":1,"obj":{"id":"55f57a4aa0105"}}
}    

code:是各种通用的错误编码,我写在了libraray/helper/dict/constHelper中,如上面的代码所示,当验证出现错误的时候,会显示响应的code,并返回

msg:就是提示语言,这里做了Unicode编码

data:返回的就是各种自定义参数,这里仅列举了通用的两种

result:也是类似于code的定义,不同的是针对的是特定请求中的返回码

obj:返回的就是个自定义对象,也可以是数组

3)密钥匹配

为了保证请求的合法性,在客户端和服务器端约定一个密钥,客户端在根据这个密钥做加密后,传过来给服务器端,服务端再加密然后做匹配。

服务器端将密钥设置在defined文件中,IOS,Android可以定义的不同:

define('API_IOS_KEY', 'DF_A98=D^&7$^%*9CNAhj0UO!!LM11');
define('API_ANDROID_KEY', 'KU98&)dsf8%@kji89dfadJK-800i122');
define('API_UNKNOW_KEY', 'jfdsfd798hj+@(*kb66578-223q670933');

而验证的规则也很简单,时间戳+密钥再MD5加密:

private function _checkSecretKey($device, $timestamp, $key) {//提取私有密钥$privateKey = '';switch (strtolower($device)) {case 'ios':$privateKey = API_IOS_KEY;break;case 'android':$privateKey = API_ANDROID_KEY;break;default:$privateKey = API_UNKNOW_KEY;break;}$keySource = $privateKey . $timestamp;//客户端安全认证失效if (empty($key) || ($key != md5($keySource))) {$this->outputCom(constHelper::API_STATUS_AUTH_FAIL, '安全认证失败');}
}

4)各种验证

1.第一个验证是只接收post请求,这里直接使用了InitPHP中的Request API。

2.客户端最低版本号验证,有时候客户端需要强制升级

3.登录验证,这里有多种情况,有些API是不需要登录的,有些是需要登录的,而有些是既可以登录也可以不登录

三、API调试工具

在交付给客户端之前,自己肯定要先测试一下的,这就需要一个简易工具了,当然也可以选择一些强大的工具,例如firefox的httprequester等。

在tool文件夹下面,我已经把这个工具放在里面了,执行页面如下:

工具的文件目录也很淳朴,就五个文件,有两个地方需要配置:

1)在indexhtml中data-domain属性,修改为你当前的api域名,在第13行左右

2)在tk.php中,修改数据库连接参数,以及客户端密钥

GitHub地址:

https://github.com/pwstrick/grape

本文转自 咖啡机(K.F.J)   博客园博客,原文链接:http://www.cnblogs.com/strick/p/4805700.html,如需转载请自行联系原作者

grape动态PHP结构(三)——API接口相关推荐

  1. php接口三结构,grape动态PHP结构(三)——API接口

    一.app视图与控制器 1)路由 这里的v1.v2就是模块,由于客户端版本一直在迭代的,那么一些老版本的客户端调用的接口就得保留起来,使得兼容.新版本就直接调用新接口. 还有一种是写html页面,在客 ...

  2. 如何以“API”接口的形式帮助电商商家解决货源及运营难题?(淘宝/京东/1688API接口的接入)

    如何帮助电商商家解决货源及运营难题?"API"接口的开发与应用场景,通过API技术接口,来帮助商家快速实现货源采购及上架等需要.那么具体来说,是如何以"API" ...

  3. api接口返回动态的json格式?我太难了,尝试一下 linq to json

    一:背景 1. 讲故事 前段时间和一家公司联调api接口的时候,发现一个奇葩的问题,它的api返回的json会动态改变,简化如下: {"Code":101,"Items& ...

  4. fetchtype 动态控制_RouterOS利用aliyun的API接口实现DDNS动态解析

    本文主要讲解如何借助阿里云aliyun的云解析API接口来实现RouterOS(以下简称ROS)的DDNS动态解析. 一.创建访问控制RAM的AccessKey 我这边简单的讲讲如何申请开通: 1.阿 ...

  5. php 动态彩码辨色 接口的调用_好用的云函数!后端低代码接口开发,零基础编写API接口...

    前言 在开发项目过程中,经常需要用到API接口,实现对数据库的CURD等操作. 不管你是专业的PHP开发工程师,还是客户端开发工程师,或者是不懂编程但懂得数据库SQL查询,又或者是完全不太懂技术的人, ...

  6. RouterOS利用aliyun的API接口实现DDNS动态解析

    本文主要讲解如何借助阿里云aliyun的云解析API接口来实现RouterOS(以下简称ROS)的DDNS动态解析. 一.创建访问控制RAM的AccessKey 我这边简单的讲讲如何申请开通: 1.阿 ...

  7. 开源项目 ——API接口管理平台数据库原型设计(三)

    开源项目 --API接口管理平台数据库原型设计(三) 背景 日常我们开发人员在开发一些常用的平台时都会用到各种各样的接口,而对于这些接口的有效管理都会成为我们的一些麻烦事,一些常见的接口管理平台我们使 ...

  8. 钉钉api接口 Java_服务端对接钉钉三步走

    服务端对接钉钉三步走 第一步:获取业务对接的appkey和appsecret 登录开发者后台,点击"应用开发"-"企业内部应用"-找到应用并点击应用图标-点击& ...

  9. 新闻api接口 关键字检索最新新闻动态

    新闻api接口,通过关键字检索最新新闻动态,包括新闻标题.新闻摘要内容.图片宽度.完整标题.发布时间.新闻来源.图片链接.新闻链接.发布完整时间等等. 接口名称:新闻api接口 接口平台:api接口 ...

最新文章

  1. FFmpeg中AVDictionary介绍
  2. 微信小程序之可滚动视图容器组件 scroll-view
  3. vs2005+Access开发网站管理系统日志1
  4. js04--对象与正则表达式
  5. JMM(Java内存模型)
  6. redis缓存策略小结
  7. 《Vim实用技巧》阅读笔记 --- 移动及跳转
  8. c语言如何随机选择入口,c语言随机排列-----适用于初学者
  9. spring security3.x学习(3)_初探过滤器机制和auto-config用法
  10. python 爬取国内高匿代理ip(西刺代理)整站DOWN下来
  11. 面试宝典(二)之经典面试题(含详细答案)
  12. Netty8# Netty之ByteBuf初探
  13. 海豚选房获中视银宗基金300万元天使轮融资,专注司法拍房
  14. 全国计算机一等奖说课视频,全国一等奖说课稿体育视频
  15. 轮播图图片大小不统一
  16. 如何在线进行PDF文档压缩?
  17. [培训-无线通信基础-10]:正交频分复用(OFDM、符号间多径干扰)
  18. NI Vision:二值图像连通域标记算法
  19. 隐马尔可夫--大内密探HMM围捕赌场老千
  20. 服务器镜像文件查看,查找镜像服务器地址

热门文章

  1. python 中文字转拼音
  2. EasyTouch初步使用
  3. 目标检测-- DeNet: Scalable Real-time Object Detection with Directed Sparse Sampling
  4. LeetCode 804 Unique Morse Code Words--python,java解法
  5. linux的source命令,linux命令之Source命令
  6. android wear 兼容问题,【悲剧了】仅 1/4 安卓手机兼容 Android Wear - 爱应用
  7. java超级点击器是怎么实现的_超萌新级的Java学习心得——简单监听器
  8. html动态加载js方法,如何通过JavaScript动态加载js
  9. 互联网各大公司职级和薪资一览
  10. CSS display 属性