一、APP接口简介

什么是app接口?app接口就是用服务端程序如php写好的脚本,以供app客户端请求而获得数据的一个东西。比如一个商铺app的首页,肯定有一些商品列表,那么当你打开这个app时,这个封装在app里的这个首页其实会去请求一个远程php文件如:http://www.example.com/index.php 去获得需要展示在首页的商品列表数据。前端工程师拿到这些数据,就会按照特定的设计,将这些内容展示出来了。
接口要实现的目的就是这样。一个app内部通常需要访问多个php接口来获得不同的数据。下面具体讲一讲接口实现的流程以及实现接口需要的一些核心的技术。


二、PHP接口知识

JSON和XML方式封装通信接口

response.class.php

<?php/***description 用于返回指定数据格式的类*@param $code [int] 返回的状态码*@param $message [string] 返回的状态信息*@param $data [array] 需要返回的数据**/class Response{public function json($code,$message,$data){$result = array("code" => $code,"message" => $message,"data" => $data);return json_encode($result);}public function xml($code,$message,$data){$result = array("code" => $code,"message" => $message,"data" => $data);header('Content-Type:text/xml');$xml = "<?xml version='1.0' encoding='UTF-8'?>\n";$xml .= "<root>";$xml .= self::encodeXml($result);$xml .= "</root>";return $xml;}/***将数据解析为XML字符串*/public static function encodeXml($data){$attr = $xml = "";foreach($data as $key => $value){if(is_numeric($key)){$attr = " id='{$key}'";$key = "item";}$xml .= "<{$key}{$attr}>";$xml .= is_array($value)?self::encodeXml($value):$value;$xml .= "</$key>";}return $xml;}
}

response.class.php是一个最简单的返回json或XML格式数据的类
下面贴出接口文件代码:
returndata.php

<?php
require "response.class.php";    //引入返回信息类//准备返回数据
$code = 200;
$message = "信息请求成功";
$data = array("name" => "ruanwnewu","sex"  => "1","age"  => "28","exp" => array("2012" => "北京瑞泰新","2013" => "兄弟连","2014" => "木蚂蚁科技"));//实例化response类
$response = new Response;//返回数据
echo $response -> json($code,$message,$data);

三、实际开发例子

  • 开发三个接口(登录、注册、文件上传),分别完成对应的功能
  • 因为本人不做APP开发,所以在实际的接口测试过程中,运用Firefox浏览器的RESTClient扩展模拟APP请求服务和接收数据
    (1)登录、注册接口的编写
    直接上代码:
<?phprequire ("../connect_db.php");$action = $_REQUEST["action"];$conn = db_connect();
mysql_query("set names 'utf8'");
mysql_select_db("FECG");switch ($action){case 'login':login();break;case 'register':register();break;case 'upload':upload();break;default:break;
}//登录接口
function login(){$account_name = $_POST["username"];$password = $_POST["password"];$result = mysql_query("SELECT * FROM app_account WHERE account_name='".$account_name."'");if (mysql_num_rows($result) > 0){$row = mysql_fetch_array($result);$salt = $row["salt"];$new_password = md5($password."".$salt);if ($new_password == $row["password"]){//登录成功$current_time = new DateTime();$login_time = $current_time -> format('Y-m-d H:i:s');$result =  mysql_query("UPDATE app_account SET last_lgin_time='".$login_time."' WHERE account_name='".$row['account_name']."'");$array = array();$array["account_id"] = $row["account_id"];$array["account_name"] = $row["account_name"];$array["create_time"] = $row["creat_time"];$json = json_encode(array("resultCode"=>200,"message"=>"login successed!","data"=>$array));echo($json);}else{$json = json_encode(array("resultCode"=>500,"message"=>"The password is wrong!please try again."));echo($json);}}else{//登录失败$json = json_encode(array("resultCode"=>500,"message"=>"please register!"));echo($json);}
}//注册接口
function register(){$account_name = $_POST["username"];$password = $_POST["password"];$result = mysql_query("select * from app_account where account_name='".$account_name."'");//查询失败if (!$result){$json = json_encode(array("resultCode"=>500,"message"=>"select failed!"));echo($json);}//用户名已经注册if (mysql_num_rows($result) > 0){$json = json_encode(array("resultCode"=>500,"message"=>"register failed!"));echo($json);}else{//插入记录到数据库中$account_id = uniqid();$salt = uniqid();$new_password = md5($password."".$salt);$current_time = new DateTime();$create_time = $current_time -> format('Y-m-d H:i:s');$last_login_time = $create_time;$result = mysql_query("insert into app_account(account_id,account_name,password,salt,creat_time,last_lgin_time) values('".$account_id."', '".$account_name."', '".$new_password."', '".$salt."', '".$create_time."', '".$last_login_time."')");$user_id = uniqid();$result1 = mysql_query("INSERT INTO app_user(user_id,username,account_id) VALUES('".$user_id."', '".$account_name."', '".$account_id."')");if ($result){$json = json_encode(array("resultCode"=>200,"message"=>"register successed!"));echo($json);}}
}//文件上传接口
function upload(){}?>

RESTClient测试:

(注册也是类似的操作)
(2)文件上传
因为是模拟,而文件上传接口涉及到文件的上传,RESTClient无法模拟。所以单独写一个客户端uploadClient.html来模拟文件上传。
uploadClient.html

<!DOCTYPE html>
<html>
<head><title>文件上传</title><meta charset="UTF-8" />
</head>
<body><form action="upload.php" method="post" enctype="multipart/form-data" >选择文件:<input type="file" name="filename" /></br>用户ID:<input type="text" name="userid" /></br>心率:<input type="text" name="rate" /></br><input type="submit" value="提交">
</form></body>
</html>

服务端接收文件接口upload.php
upload.php

<?phprequire ("../connect_db.php");$conn = db_connect();
mysql_query("set names 'utf8'");
mysql_select_db("FECG");$file_name = $_POST["filename"];
$userid = $_POST["userid"];
$heart_rate = $_POST["rate"];if ($_FILES['filename']['name'] != NULL){if ($_FILES['filename']['error']){$data = array("resultCode"=>1,"message"=>"失败,上传文件出错!");echo json_encode($data);}else{//获取文件后缀名$file_extension = substr(strrchr($_FILES['filename']['name'], '.'), 1);//判断文件夹是否存在$path = "/var/www/html/FECG/fecg_segment_data/".$userid;if (!file_exists($path)){//创建以用户名命名的文件夹if(mkdir ($path)){$data = array("message"=>"ok");echo json_encode($data);}}//对上传文件进行命名$file_path = '/var/www/html/FECG/fecg_segment_data/'.$userid.'/'.date("YmdHis").".".$file_extension;if (is_uploaded_file($_FILES['filename']['tmp_name'])){$result = move_uploaded_file($_FILES['filename']['tmp_name'], $file_path);if ($result){//文件上传成功,进行第二步更新数据库$result = mysql_query("SELECT * FROM app_account WHERE account_name='".$userid."'");if (!$result){$num = 123;$data = array("resultCode"=>2,"message"=>"userid","data"=>$userid);echo json_encode($data);}$row = mysql_fetch_array($result, MYSQL_ASSOC);$account_id = $row["account_id"];$result1 = mysql_query("SELECT * FROM app_user WHERE account_id='".$account_id."'");$row1 = mysql_fetch_array($result1, MYSQL_ASSOC);$user_id = $row1["user_id"];$user_name = $row1["username"];$ecg_segment_id = uniqid();$channel = 3;$current_time = new DateTime();$create_time = $current_time -> format('Y-m-d H:i:s');$result = mysql_query("INSERT INTO ecg_segment(ecg_segment_id,channel,heart_rate,ecg_url,user_name,user_id)VALUES('".$ecg_segment_id."', '".$channel."', '".$heart_rate."', '".$file_path."', '".$user_name."', '".$user_id."')");$task_id = uniqid();$server_analysis = "异常";$result1 = mysql_query("INSERT INTO task(task_id,creat_time,server_analysis,ecg_segment_id)VALUES('".$task_id."', '".$create_time."', '".$server_analysis."', '".$ecg_segment_id."')");if ($result){$data = array("resultCode"=>2,"message"=>"文件上传成功!");echo json_encode($data);}else{$data = array("resultCode"=>3,"message"=>"服务器错误!");echo json_encode($data);}}else{$data = array("resultCode"=>4,"message"=>"uploaded failed!");echo json_encode($data);}}else{$data = array("resultCode"=>5,"message"=>"文件上传失败!");echo json_encode($data);}}
}else{$data = array("resultCode"=>300,"message"=>"文件名不能为空!");echo json_encode($data);
}?>

(上述代码都是根据本人项目需要开发的相应接口)

PHP服务端开发APP接口相关推荐

  1. 微信支付java服务端开发(APP)

    我这边是针对微信商户支付功能开发.其他的未涉及到. 当你所有的准备工作准备好后:微信支付申请成功,api_key 配置好,等等一系列. 那么让我们进入java开发吧. 微信支付demo下载: http ...

  2. 第13章 Kotlin 集成 SpringBoot 服务端开发(1)

    第13章 Kotlin 集成 SpringBoot 服务端开发 本章介绍Kotlin服务端开发的相关内容.首先,我们简单介绍一下Spring Boot服务端开发框架,快速给出一个 Restful He ...

  3. NodeJS+Express+mySQL服务端开发详解

    NodeJS+Express+mySQL服务端开发详解 随着NodeJS的发展,现在已经被很多人熟知,NodeJS已经成为了前端开发人员必备的技能.本文不会对NodeJS过多介绍 如果你感兴趣可以访问 ...

  4. Express+MongoDB服务端开发教程

    本项目源码地址 my_express_server 参考资料 NodeJS服务端开发极速入门 准备工作 安装一些必要的全局依赖 # 全局暴力设置淘宝源 npm config set registry ...

  5. github nodejs mysql_GitHub - lizhuohaicode/express: nodejs服务端开发(Express+Mysql)---小k博客...

    nodejs服务端开发(Express+Mysql) 项目展示 git clone git@github.com:htmlk/express.git 2.再导入express.sql到数据库,数据库名 ...

  6. 七牛CEO许式伟:服务端开发那些事儿

    [http://www.donews.com/company/201511/2907818.shtm] 七牛CEO许式伟:服务端开发那些事儿 2015-11-09 11:14:05 服务端开发对于任何 ...

  7. 一场B站服务端开发面试之旅

    作者 | 蓝 来源 | 我是程序员小贱(ID:Lanj1995Q) 此次B站服务端开发面试之旅可谓惊险,不过通过对大部分面试题套路的掌握,不出意外还是拿下了,下面我们来看看这些题是不是常见的不能再常见 ...

  8. java服务端开发 php_PHP使用thrift做服务端开发

    php中文网最新课程 每日17点准时技术干货分享 php使用thrift做服务端开发 thrift采用接口描述语言定义和创建服务,用二进制格式传输数据,体积更小.效率更高,对于高并发.数据量大和多语言 ...

  9. 关于Go语言在服务端做Restful接口和socket通信

    转载自: http://xiaorui.cc/2014/10/25/%e5%85%b3%e4%ba%8ego%e8%af%ad%e8%a8%80%e5%9c%a8%e6%9c%8d%e5%8a%a1% ...

最新文章

  1. 【廖雪峰python进阶笔记】模块
  2. 大数据应用开发八大基本原则
  3. Dubbo中的监控和管理
  4. html/js/css资源
  5. 单处理器系统的进程调度_第三章:进程与线程
  6. #define、typedef与const
  7. 接口说明_实时语音识别_智能语音交互-阿里云
  8. php学生管理系统整理
  9. 解决读取文件乱码问题
  10. 【硬石科技】电机系列教学(基于STM32)——舵机的控制
  11. Moebius for SQL Server
  12. 02Hadoop3分布式文件系统HDFS-01HDFS Shell文件操作
  13. LDP --- 标签分发协议
  14. 常见的GNU汇编伪指令
  15. html图片平铺div,前端小知识——图片平铺问题
  16. 独热编码 (One-Hot Encoding) 介绍及MATLAB命令
  17. 基于CAD纵断面图生成地质体模型
  18. Python入门练习选择题
  19. 在后台定时连续截屏的工具 —— 定时执行专家
  20. 学校计算机班班通维护保养记录,小学班班通使用管理制度

热门文章

  1. HTTP缓存机制及原理(强制缓存/协商缓存)
  2. SVM 用于将数据分类为两分类或多分类(Matlab代码实现)
  3. 新手小白如何租用GPU云服务器跑深度学习
  4. 【远程连接 多个SQL SERVER数据库实例】
  5. 集中式自动抄表系统原理与应用
  6. 集成项目管理交付清单
  7. Intellij idea 代码提示忽略字母大小写和常用快捷键及设置
  8. InstallShield.12.豪华完全版 安装与激活说明
  9. C++常见排序算法——冒泡排序算法
  10. yahoocn邮箱登录脚本