什么是app接口?app接口就是用服务端程序如php写好的脚本,以供app客户端请求而获得数据的一个东西。比如一个商铺app的首页,肯定有一些商品列表,那么当你打开这个app时,这个封装在app里的这个首页其实会去请求一个远程php文件如:http://www.example.com/index.php 去获得需要展示在首页的商品列表数据。前端工程师拿到这些数据,就会按照特定的设计,将这些内容展示出来了。
接口要实现的目的就是这样。一个app内部通常需要访问多个php接口来获得不同的数据。下面具体讲一讲接口实现的流程以及实现接口需要的一些核心的技术。
response.class.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 = "\n";
$xml .= "" ;
$xml .= self::encodeXml($result);
$xml .= "";
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
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);
require ("../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
<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
require ("../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);
}
?>
(上述代码都是根据本人项目需要开发的相应接口)