使用Thinkphp框架开发移动端接口


Posted in PHP onAugust 05, 2015

方案一:给原生APP提供api接口

使用TP框架时 放在common文件夹下文件名就叫function.php

<?php
/**
 * Created by zhangkx
 * Email: zkx520tnhb@163.com
 * Date: 2015/8/1
 * Time: 23:15
 */
 
/*************************** api开发辅助函数 **********************/
 
/**
 * @param null $msg  返回正确的提示信息
 * @param flag success CURD 操作成功
 * @param array $data 具体返回信息
 * Function descript: 返回带参数,标志信息,提示信息的json 数组
 *
 */
function returnApiSuccess($msg = null,$data = array()){
  $result = array(
    'flag' => 'Success',
    'msg' => $msg,
    'data' =>$data
  );
  print json_encode($result);
}
 
/**
 * @param null $msg  返回具体错误的提示信息
 * @param flag success CURD 操作失败
 * Function descript:返回标志信息 ‘Error',和提示信息的json 数组
 */
function returnApiError($msg = null){
  $result = array(
    'flag' => 'Error',
    'msg' => $msg,
  );
  print json_encode($result);
}
 
/**
 * @param null $msg  返回具体错误的提示信息
 * @param flag success CURD 操作失败
 * Function descript:返回标志信息 ‘Error',和提示信息,当前系统繁忙,请稍后重试;
 */
function returnApiErrorExample(){
  $result = array(
    'flag' => 'Error',
    'msg' => '当前系统繁忙,请稍后重试!',
  );
  print json_encode($result);
}
 
/**
 * @param null $data
 * @return array|mixed|null
 * Function descript: 过滤post提交的参数;
 *
 */
 
 function checkDataPost($data = null){
  if(!empty($data)){
    $data = explode(',',$data);
    foreach($data as $k=>$v){
      if((!isset($_POST[$k]))||(empty($_POST[$k]))){
        if($_POST[$k]!==0 && $_POST[$k]!=='0'){
          returnApiError($k.'值为空!');
        }
      }
    }
    unset($data);
    $data = I('post.');
    unset($data['_URL_'],$data['token']);
    return $data;
  }
}
 
/**
 * @param null $data
 * @return array|mixed|null
 * Function descript: 过滤get提交的参数;
 *
 */
function checkDataGet($data = null){
  if(!empty($data)){
    $data = explode(',',$data);
    foreach($data as $k=>$v){
      if((!isset($_GET[$k]))||(empty($_GET[$k]))){
        if($_GET[$k]!==0 && $_GET[$k]!=='0'){
          returnApiError($k.'值为空!');
        }
      }
    }
    unset($data);
    $data = I('get.');
    unset($data['_URL_'],$data['token']);
    return $data;
  }
}

查询单个果品详细信息

/**
  * 发布模块
  * 
  * 获取信息单个果品详细信息
  *
  */
  public function getMyReleaseInfo(){
    //检查是否通过post方法得到数据
    checkdataPost('id');
    $where['id'] = $_POST['id'];
    $field[] = 'id,fruit_name,high_price,low_price,address,size,weight,fruit_pic,remark';
    $releaseInfo = $this->release_obj->findRelease($where,$field);
    $releaseInfo['remark'] = mb_substr($releaseInfo['remark'],0,49,'utf-8').'...';
    //多张图地址按逗号截取字符串,截取后如果存在空数组则需要过滤掉
    $releaseInfo['fruit_pic'] = array_filter(explode(',', $releaseInfo['fruit_pic']));
    $fruit_pic = $releaseInfo['fruit_pic'];unset($releaseInfo['fruit_pic']);
    //为图片添加存储路径
    foreach($fruit_pic as $k=>$v ){
      $releaseInfo['fruit_pic'][] = 'http://'.$_SERVER['HTTP_HOST'].'/Uploads/Release/'.$v;
    }
    if($releaseInfo){
      returnApiSuccess('',$releaseInfo);
    }else{
      returnApiError( '什么也没查到(+_+)!');
    }
  }

findRelease() 方法的model

/**
  * 查询一条数据
  */
  public function findRelease($where,$field){
    if($where['status'] == '' || empty($where['status'])){
      $where['status'] = array('neq','9');
    }
    $result = $this->where($where)->field($field)->find();
    return $result;
  }

app端接收到的数据(解码json之后)

{
  "flag": "success",
  "message": "",
  "responseList": {
    "id": "2",
    "fruit_name": "苹果",
    "high_price": "8.0",
    "low_price": "5.0",
    "address": "天津小白楼水果市场",
    "size": "2.0",
    "weight": "2.0",
    "remark": "急需...",
    "fruit_pic": [
      "http://fruit.txunda.com/Uploads/Release/201508/55599e7514815.png",
      "http://fruit.txunda.com/Uploads/Release/201508/554f2dc45b526.jpg"
    ]
  }
}

app端接收到的数据(原生json串)

{"flag":"success","message":"","responseList":{"id":"2","fruit_name":"\u82f9\u679c","high_price":"8.0","low_price":"5.0","address":"\u5929\u6d25\u5c0f\u767d\u697c\u6c34\u679c\u5e02\u573a","size":"2.0","weight":"2.0","remark":"\u6025\u9700...","fruit_pic":["http:\/\/fruit.txunda.com\/Uploads\/Release\/201508\/55599e7514815.png","http:\/\/fruit.txunda.com\/Uploads\/Release\/201508\/554f2dc45b526.jpg"]}}

方案二:另外我们还可以通过ThinkPHP实现移动端访问自动切换主题模板,这样也可以做到移动端访问

ThinkPHP的模板主题机制,如果只是在PC,只要需修改 DEFAULT_THEME (新版模板主题默认是空,表示不启用模板主题功能)配置项就可以方便的实现多模板主题切换。

但对于移动端和PC端,也许你会设计完全不同的主题风格,且针对不同的来路提供不同的渲染方式,其中一种比较流行的方法是“响应式设计”,但就本人经历而言,要实现完全的“响应式设计”并不是那么容易,且解决兼容问题也是个难题,假设是大型站点,比如:淘宝、百度、拍拍这些,响应式设计肯定是满足不了需求的,而是需要针对手机访问用户提供单独的手机网站。

ThinkPHP 完全可以实现,而且相当简单。和TPM的智能模版切换引擎一样,只要对来路进行判断处理即可。

一、将 ismobile() 加入到{项目/Common/common.php}

function ismobile() {
  // 如果有HTTP_X_WAP_PROFILE则一定是移动设备
  if (isset ($_SERVER['HTTP_X_WAP_PROFILE']))
    return true;
  
  //此条摘自TPM智能切换模板引擎,适合TPM开发
  if(isset ($_SERVER['HTTP_CLIENT']) &&'PhoneClient'==$_SERVER['HTTP_CLIENT'])
    return true;
  //如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
  if (isset ($_SERVER['HTTP_VIA']))
    //找不到为flase,否则为true
    return stristr($_SERVER['HTTP_VIA'], 'wap') ? true : false;
  //判断手机发送的客户端标志,兼容性有待提高
  if (isset ($_SERVER['HTTP_USER_AGENT'])) {
    $clientkeywords = array(
      'nokia','sony','ericsson','mot','samsung','htc','sgh','lg','sharp','sie-','philips','panasonic','alcatel','lenovo','iphone','ipod','blackberry','meizu','android','netfront','symbian','ucweb','windowsce','palm','operamini','operamobi','openwave','nexusone','cldc','midp','wap','mobile'
    );
    //从HTTP_USER_AGENT中查找手机浏览器的关键字
    if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
      return true;
    }
  }
  //协议法,因为有可能不准确,放到最后判断
  if (isset ($_SERVER['HTTP_ACCEPT'])) {
    // 如果只支持wml并且不支持html那一定是移动设备
    // 如果支持wml和html但是wml在html之前则是移动设备
    if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
      return true;
    }
  }
  return false;
 }

二、在{项目/Lib/}创建一个 CommonAction.php,如果你的项目已公共控制器,则无需创建,直接加在里面即可。

Class CommonAction extends Action{
  Public function _initialize(){
    //移动设备浏览,则切换模板
    if (ismobile()) {
      //设置默认默认主题为 Mobile
      C('DEFAULT_THEME','Mobile');
    }
    //............你的更多代码.......
  }
 }

通过以上2种方式均可实现移动端访问,一种是原生,一种是伪原生,小伙伴们根据自己的项目需求来选择吧。

PHP 相关文章推荐
php 中include()与require()的对比
Oct 09 PHP
来自PHP.NET的入门教程
Oct 09 PHP
PHP中全局变量global和$GLOBALS[]的区别分析
Aug 06 PHP
深入理解:单一入口、MVC、ORM、CURD、ActiveRecord概念
Jun 06 PHP
php生成数组的使用示例 php全组合算法
Jan 16 PHP
php生成QRcode实例
Sep 22 PHP
PHP检测字符串是否为UTF8编码的常用方法
Nov 21 PHP
php正则表达式学习笔记
Nov 13 PHP
利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel
Apr 27 PHP
PHP内置函数生成随机数实例
Jan 18 PHP
laravel 解决Validator使用中出现的问题
Oct 25 PHP
php 的多进程操作实践案例分析
Feb 28 PHP
wampserver改变默认网站目录的办法
Aug 05 #PHP
使用PHP接受文件并获得其后缀名的方法
Aug 05 #PHP
PHP合并discuz用户脚本的方法
Aug 04 #PHP
PHP-FPM之Chroot执行环境详解
Aug 03 #PHP
织梦sitemap地图实时推送给百度的教程
Aug 03 #PHP
php生成图片验证码的实例讲解
Aug 03 #PHP
android上传图片到PHP的过程详解
Aug 03 #PHP
You might like
php 分页函数multi() discuz
2009/06/21 PHP
PHP面向对象法则
2012/02/23 PHP
php中的常用魔术方法汇总
2016/02/14 PHP
PHP删除数组中特定元素的两种方法
2019/02/28 PHP
网页中CDATA标记的说明
2010/09/12 Javascript
jQuery中.live()方法的用法深入解析
2013/12/30 Javascript
setInterval计时器不准的问题解决方法
2014/05/08 Javascript
JavaScript插件化开发教程 (三)
2015/01/27 Javascript
jQuery树形下拉菜单特效代码分享
2015/08/15 Javascript
使用Bootstrap美化按钮实例代码(demo)
2017/02/03 Javascript
JS原生带小白点轮播图实例讲解
2017/07/22 Javascript
详解.vue文件中监听input输入事件(oninput)
2017/09/19 Javascript
通过jquery的ajax请求本地的json文件方法
2018/08/08 jQuery
JavaScript实现图片上传并预览并提交ajax
2019/09/30 Javascript
JS事件循环机制event loop宏任务微任务原理解析
2020/08/04 Javascript
解决VUE项目localhost端口服务器拒绝连接,只能用127.0.0.1的问题
2020/08/14 Javascript
[44:33]EG vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python fileinput模块使用实例
2015/06/03 Python
python定时利用QQ邮件发送天气预报的实例
2017/11/17 Python
Django中cookie的基本使用方法示例
2018/02/03 Python
Python基于递归算法实现的汉诺塔与Fibonacci数列示例
2018/04/18 Python
使用NumPy和pandas对CSV文件进行写操作的实例
2018/06/14 Python
对TensorFlow的assign赋值用法详解
2018/07/30 Python
python异步实现定时任务和周期任务的方法
2019/06/29 Python
python3利用Axes3D库画3D模型图
2020/03/25 Python
python开发前景如何
2020/06/11 Python
.NET初级开发工程师面试题
2014/04/18 面试题
卫校护理专业毕业生求职信
2013/11/26 职场文书
酒店总经理欢迎词
2014/01/15 职场文书
蜜蜂引路教学反思
2014/02/04 职场文书
家长会标语
2014/06/24 职场文书
考试作弊检讨书
2014/10/21 职场文书
《这片土地是神圣的》教学反思
2016/02/16 职场文书
详解Vue的sync修饰符
2021/05/15 Vue.js
pandas进行数据输入和输出的方法详解
2022/03/23 Python
一行Python命令实现批量加水印
2022/04/07 Python