一、app视图与控制器

1)路由

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

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

Controller的注意ismodule是true,module_ :

$Init['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的路由

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

2.rewrite模式: /index/run/id=1 (需要开启

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

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

2)模拟session

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

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

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

二、apiController通用控制器类

public function__con::__construct();$this->controller_name = $this->getC();$this->action_name = $this->getA();$this->module_name = $this->getM();//访问 $this->_logVisit();// if (!$this->controller->is_post()) {$this->output(constHelper::API_STATUS_NEED_POST, '必须为POST请求'); }/** * 请求参数示例 * __ua=*/ $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::getMy);$this->member = $memberModel->getMemberBySession($session); }//session没有获取到相关信息 也要做跳转 if($needCheck && empty($this->member)) {$this->output(constHelper::API_STATUS_NEED_LOGIN, '请先登录'); } }

1)访问参数日志记录

当客户端发起一个请求的时候,会带上很多参数,例如

调用 $this->_logVisit(); 将这些信息全部存到

2)output返回参数

返回参数的格式如下:

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

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调试工具

在交付给客户端之前,自己肯定要先

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

工具的文件

1)在indexhtml中 data-domain 属性,修改为你当前的api

2)在 tk.php 中,修改

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

  1. 最新最全的免费股票数据接口--沪深A股基础列表数据API接口(三)

    沪深A股基础实时数据API 数据来源:麦蕊智数 请求方式:Get(直接在浏览器打开就可以看到返回的数据) 数据格式:标准Json格式[{},...{}] 数据时效:实时更新 API说明文档:https ...

  2. java获取api接口新浪数据,新浪短网址API接口的获取以及API接口的调用文档分享...

    我们可能会收到类似于这样的短信,发现其中的链接并不是常规的网址链接,而是个短小精悍的短链接,产品中经常需要这样的需求,如果在给用户下发的短信中是一个很长的连接,用户体验肯定很差,因此我们需要实现长链接 ...

  3. 京东整店商品查询API接口(item_search_shop-获得店铺的所有商品API接口)

    可以通过京东整店商品列表接口采集店铺所有商品详情页各项数据,包含商品标题,skuid.价格.优惠价,收藏数.月销售量.SKU图.标题.详情页图片等页面上有的数据均可以拿到,大家都知道,京东的反爬虫机制 ...

  4. 淘宝商品评价api接口(item_review-获得淘宝商品评论API接口),天猫商品评论API接口

    淘宝商品评价api接口(item_review-获得淘宝商品评论API接口),天猫商品评论API接口可通过商品id,获取商品评价信息.评价内容.买家秀图片.评论浏览量.评价视频.评价追评等页面上的数据 ...

  5. 京东店铺的所有商品API接口(item_search_shop-获得店铺的所有商品API接口),整店商品API接口

    可以通过京东店铺的所有商品API接口采集店铺所有商品详情页各项数据,包含商品标题,SKU信息.价格.优惠价,收藏数.销量.SKU图.标题.详情页图片等页面上有的数据均可以拿到,大家都知道,京东的反爬虫 ...

  6. 数据结构课程设计:顺序结构、动态链表结构下的一元多项式的加法、减法、乘法的实现...

    原来做的数据结构课程设计,今天整理资料时偶然发现了,自己留着没啥意思,共享一下吧,互相交流学习 要求 设有一元多项式Am(x)和Bn(x). Am(x)=A0+A1x1+A2x2+A3x3+- +Am ...

  7. 接口结构_适用于Mac系统的API接口调试应用

    Apifox 中文版是一款适用于 Mac 的API接口调试应用.官方介绍 Apifox = Postman + Swagger + Mock.Apifox 可以用于接口文档.接口调试.Mock.自动化 ...

  8. 基于Qt的音乐播放器(三)通过酷狗音乐的api接口,返回json格式歌曲信息(播放地址,歌词,图片)

    2020博客之星年度总评选进行中:请为74号的狗子投上宝贵的一票! 我的投票地址:点击为我投票 文章目录 前言 1.获取歌曲搜索列表api接口 2.获取单个歌曲详细信息包括歌词 3.总结 前言 首先说 ...

  9. php查询ip归属地api接口_【php】利用新浪api接口与php获取远程数据的方法,获取IP地址,并获取相应的IP归属地...

    本文与<[Servlet]Javaweb中,利用新浪api接口,获取IP地址,并获取相应的IP归属地>(点击打开链接)为姊妹篇,只是后端编程语言换成了php. 做出同样的效果,打开页面,得 ...

最新文章

  1. chrome 窗体高度_Chrome窗口大小自定义调节插件下载_Chrome窗口大小自定义调节插件官方下载-太平洋下载中心...
  2. 切版网上线,启用qieban.cn
  3. 麦克纳姆轮——机械部分
  4. 服务器用REG ECC内存的好处
  5. Android入门——电话拨号器和四种点击事件
  6. 推荐一些经过实践检验的学习方法
  7. 网易严选Java开发三面面经:mysql索引面试题
  8. robot:循环遍历数据库查询结果是否满足要求
  9. 优雅的redux异步中间件 redux-effect
  10. Windows下jupyter notebook 修改打开的浏览器为chrome
  11. linux安装mysql默认的配置文件_[转]关于Linux安装mysql默认配置文件位置
  12. oracle 命令分析2
  13. 脾气好的领导不是好领导
  14. 函数的作用、函数的定义及函数的调用
  15. python爬虫学习-定制请求头
  16. (与运算)、|(或运算)、^(异或运算)的含义
  17. SQL注入攻击的原理、分类和防御方法
  18. JS——unload事件
  19. itext html转换pdf,使用iText-2.0.8将Html转换为pdf,带图片功能
  20. 《向上生长》读书笔记

热门文章

  1. 静默错误:为什么看了那么多灾难,还是过不好备份这一关?
  2. Hadoop 面试,来看这篇就够了
  3. 快来看,大数据两地三中心的容灾也可以如此省心!
  4. 云小课 | 华为云KYON之L2CG
  5. 从零开始学python | 使用Python映射,过滤和缩减函数:所有您需要知道的
  6. 云图说 | GPU共享型AI容器,让AI开发更普及
  7. 区块链学习笔记:D04 区块链在各行业领域的应用(二)
  8. 设计模式的C语言应用-观察者模式-第四章
  9. doxygen 教程 linux,doxygen linux
  10. oracle中查询实现以下结果,如何在Oracle中为查询结果分配等级?