使用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数组函数序列之array_sum() - 计算数组元素值之和
Oct 29 PHP
PHP连接MySQL的2种方法小结以及防止乱码
Mar 11 PHP
修改ThinkPHP缓存为Memcache的方法
Jun 25 PHP
PHP常用数组函数介绍
Jul 28 PHP
php截取html字符串及自动补全html标签的方法
Jan 15 PHP
PHP编写学校网站上新生注册登陆程序的实例分享
Mar 21 PHP
php cookie用户登录的详解及实例代码
Jan 03 PHP
在IIS下安装PHP扩展的方法(超简单)
Apr 10 PHP
PHP中关键字interface和implements详解
Jun 14 PHP
PHP htmlspecialchars()函数用法与实例讲解
Mar 08 PHP
详解Laravel服务容器的绑定与解析
Nov 05 PHP
php中数组最简单的使用方法
Dec 27 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
require(),include(),require_once()和include_once()区别
2008/03/27 PHP
thinkphp实现发送邮件密码找回功能实例
2014/12/01 PHP
CI框架的安全性分析
2016/05/18 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
打豆豆小游戏 用javascript编写的[打豆豆]小游戏
2013/01/08 Javascript
jquery实现漫天雪花飞舞的圣诞祝福雪花效果代码分享
2015/08/20 Javascript
Javascript实现的SHA-256加密算法完整实例
2016/02/02 Javascript
JavaScript代码生成PDF文件的方法
2016/02/26 Javascript
JS中使用FormData上传文件、图片的方法
2016/08/07 Javascript
jquery ajax后台返回list,前台用jquery遍历list的实现
2016/10/30 Javascript
详解VueRouter进阶之导航钩子和路由元信息
2017/09/13 Javascript
vue+element的表格实现批量删除功能示例代码
2018/08/17 Javascript
微信小程序实现文字无限轮播效果
2018/12/28 Javascript
使用Angular Cli如何创建Angular私有库详解
2019/01/30 Javascript
微信小程序 SOTER 生物认证DEMO 指纹识别功能
2019/12/13 Javascript
Windows安装Python、pip、easy_install的方法
2017/03/05 Python
python3中set(集合)的语法总结分享
2017/03/24 Python
python xpath获取页面注释的方法
2019/01/14 Python
python整小时 整天时间戳获取算法示例
2019/02/20 Python
了解不常见但是实用的Python技巧
2019/05/23 Python
python中的协程深入理解
2019/06/10 Python
python进程的状态、创建及使用方法详解
2019/12/06 Python
django 多数据库及分库实现方式
2020/04/01 Python
python中sort sorted reverse reversed函数的区别说明
2020/05/11 Python
Python实时监控网站浏览记录实现过程详解
2020/07/14 Python
Python类class参数self原理解析
2020/11/19 Python
HTML高亮关键字的实现代码
2018/10/22 HTML / CSS
世界上最大的各式箱包网络零售店:eBag
2016/07/21 全球购物
Ibood荷兰:互联网每日最佳在线优惠
2019/02/28 全球购物
Ellesse英国官网:意大利高级运动品牌
2019/07/23 全球购物
会计工作心得体会
2014/01/13 职场文书
捐资助学倡议书
2014/04/15 职场文书
稽核岗位职责范本
2015/04/13 职场文书
驳回起诉裁定书
2015/05/19 职场文书
劳保用品管理制度范本
2015/08/06 职场文书
Java时间工具类Date的常用处理方法
2022/05/25 Java/Android