APP接口简介:
什么是app接口?app接口就是用服务端程序如php写好的脚本,以供app客户端请求而获得数据的一个东西。比如一个视频app的首页,肯定有一些视频列表,那么当你打开这个app时,这个封装在app里的这个首页其实会去请求一个远程php文件如:http://www.example.com/index.php 去获得需要展示在首页的视频列表数据。前段工程师拿到这些数据,就会按照特定的设计,将这些内容展示出来了。
接口要实现的目的就是这样。一个app内部通常需要访问多个php接口来获得不同的数据。下面具体讲一讲接口实现的流程以及实现接口需要的一些核心的技术。
思路流程:
如何通信:
客户端发送http请求 服务器返回数据。
封装通信接口方法:
1、对于数据的输出最好用json,json具有相当强大的跨平台性,市场上各大主流编程语言都支持json解析,json正在逐步取代xml,成为网络数据的通用格式
2、接口安全,一定要增加接口验证。例如,客户端和服务端针对不同接口统一做好加密方式,服务端在对于每次接口需要都要进行验证。以保证防止接口被恶意刷新或黑客恶意调用,尤其是大型商业应用。
3、对于线上的 API 必须保证所有接口正常且关闭所有的错误信息 => error_reporting(0),在输出JSON 时,不能有任何其它输出,否则,客户端将解析数据失败,直接 Crash!
4、开发 API 和 WEB 有一定的区别,如果是 WEB 的话,可能代码出错了,不会导致特别严重的错误,也许只是导致数据写入和查询失败,也许导致 WEB 的某个部分错位或乱码。但如果是 API,直接 Crash!
什么是app接口?app接口就是用服务端程序如php写好的脚本,以供app客户端请求而获得数据的一个东西。比如一个视频app的首页,肯定有一些视频列表,那么当你打开这个app时,这个封装在app里的这个首页其实会去请求一个远程php文件如:http://www.example.com/index.php 去获得需要展示在首页的视频列表数据。前段工程师拿到这些数据,就会按照特定的设计,将这些内容展示出来了。
接口要实现的目的就是这样。一个app内部通常需要访问多个php接口来获得不同的数据。下面具体讲一讲接口实现的流程以及实现接口需要的一些核心的技术。
思路流程:
如何通信:
客户端发送http请求 服务器返回数据。
封装通信接口方法:
2-1 JSON方式封装通信接口 (14:39)
先上代码:
- 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);
- }
- }
response.class.PHP是一个最简单的返回json格式数据的类,在下面的课程中我们会进一步对其进行完善。
下面贴出接口文件代码:
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);
请求returndata.php接口返回的数据如下图所示:
这样就完成了一个最基本的,封装好的json数据通信接口。
2-2 PHP生成XML数据 (12:02)
生成XML格式数据一般有三种方法:
- 拼接字符串
- domDocument
- simpleXML
在这里我只讲解第一种方法生成XML数据的方法。上代码:
producexml.php
- <?php
- header('Content-Type:text/xml');
- $xml = '<?xml version="1.0" encoding="utf-8" ?>';
- $xml .= '<res>';
- $xml .= '<code>404</code>'."\r\n";
- $xml .= '<message>数据返回成功</message>'."\r\n";
- $xml .= '<data>'."\r\n";
- $xml .= '<name>软文无</name>'."\r\n";
- $xml .= '<sex>1</sex>'."\r\n";
- $xml .= '<age>28</age>'."\r\n";
- $xml .= '</data>';
- $xml .= '</res>';
- echo $xml;
2-3 XML方式封装通信接口 (17:50)
上代码:
- <?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;
- }
- }
同样用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 -> xml($code,$message,$data);
得到如下图所示的XML文件结果
2-4 综合方式封装通信数据方法 (11:15)
将两种封装方法综合起来,并能够根据请求的参数来返回指定格式的数据,上代码:
完善后的response类
总结:
- <?php
- /**
- *description 用于返回指定数据格式的类
- *@param $code [int] 返回的状态码
- *@param $message [string] 返回的状态信息
- *@param $data [array] 需要返回的数据
- */
- class Response{
- public function show($code,$message,$data,$type="json"){
- if($type == "json"){
- $this->json($code,$message,$data);
- }else{
- $this->xml($code,$message,$data);
- }
- }
- 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;
- }
- }
1、对于数据的输出最好用json,json具有相当强大的跨平台性,市场上各大主流编程语言都支持json解析,json正在逐步取代xml,成为网络数据的通用格式
2、接口安全,一定要增加接口验证。例如,客户端和服务端针对不同接口统一做好加密方式,服务端在对于每次接口需要都要进行验证。以保证防止接口被恶意刷新或黑客恶意调用,尤其是大型商业应用。
3、对于线上的 API 必须保证所有接口正常且关闭所有的错误信息 => error_reporting(0),在输出JSON 时,不能有任何其它输出,否则,客户端将解析数据失败,直接 Crash!
4、开发 API 和 WEB 有一定的区别,如果是 WEB 的话,可能代码出错了,不会导致特别严重的错误,也许只是导致数据写入和查询失败,也许导致 WEB 的某个部分错位或乱码。但如果是 API,直接 Crash!