作为最流行的服务端语言PHP(PHP: Hypertext Preprocessor),在开发API方面,是很简单且极具优势的。API(Application Programming Interface,应用程序接口)架构,已经成为目前互联网产品开发中常见的软件架构模式,并且诞生很多专门API服务的公司,如:聚合数据(https://www.juhe.cn/)、百度APIStore(http://apistore.baidu.com/

先了解下 API :
1、API 比开发 WEB 更简洁,但可能逻辑更复杂,API 只返回结果,也就是只完成数据输出,不呈现页面,
2、WEB 开发,更多的是 GET 和 POST 请求,API 还有 PUT、DELETE 请求
3、和 WEB 开发一样,首先需要一些相关的参数,这些参数,都会由客户端传过来,也许是 GET 也许是 POST,这个需要开发团队相互之间约定好,或者制定统一规范
4、有了参数,根据应用需求,完成数据处理,例如:获取用户信息、发朋友圈、发消息、一局游戏结束数据提交等等
5、数据逻辑处理完之后,返回客户端所需要用到的相关数据,例如:用户信息数组、朋友圈列表、消息状态、游戏结果数据等等,那数据是怎么返给客户端呢?常见有XML、JSON,设置相应的header并把要返回的数据直接打印出来即可
6、客户端获取到你返回的数据后,在客户端本地和用户进行交互

所以我们大概知道,API 其实不存在Web领域的 MVC 架构模式,若要分层的,API 也只有 M 和 C 两层,当然,后端可能会有更加复杂的架构!

通过下面一个HTTP协议的API实例来理解PHP怎么开发API:

  1. <?php
  2. /**
  3. * 比较标准的接口输出函数
  4. * @param string $info 消息
  5. * @param integer $code 接口错误码,很关键的参数
  6. * @param array $data 附加数据
  7. * $param string $location 重定向
  8. * @return array
  9. */
  10. function var_json($info = '', $code = 10000, $data = array(), $location = '') {
  11. $out['code'] = $code ?: 0;
  12. $out['info'] = $info ?: ($out['code'] ? 'error' : 'success');
  13. $out['data'] = $data ?: array();
  14. $out['location'] = $location;
  15. header('Content-Type: application/json; charset=utf-8');
  16. echo json_encode($out, JSON_HEX_TAG);
  17. exit(0);
  18. }
  19.  
  20. $a = empty($_GET['a']) ? '' : $_GET['a'];
  21. $qq = empty($_GET['qq']) ? 0 : intval($_GET['qq']);
  22.  
  23. //假设这是数据源,如MySQL
  24. $data = array();
  25. $data[979136] = array('qq'=>979136, 'vip'=>5,'level'=>128, 'reg_time'=>1376523234, 'qb'=>300);
  26. $data[979137] = array('qq'=>979137, 'vip'=>8,'level'=>101, 'reg_time'=>1377123144, 'qb'=>300);
  27.  
  28. preg_match('/^[a-zA-Z]+$/', $a) || var_json('非法调用');
  29. isset($data[$qq]) || var_json('用户不存在', 100001);
  30.  
  31. switch ($a) {
  32. //获取用户基本信息
  33. case 'info':
  34. //你的更多业务逻辑 ...
  35. var_json('success', 0, $data[$qq]);
  36. break;
  37. //获取动态消息
  38. case 'message':
  39. var_json('您正在调用动态消息接口', 0);
  40. break;
  41. //获取好友列表
  42. case 'friends':
  43. var_json('你正在调用好友列表接口', 0);
  44. break;
  45. default:
  46. var_json('非法调用');
  47. }

接口输出示例,返回的是一串json:

  1. {
  2. "code": 0,
  3. "info": "success",
  4. "data": {
  5. "qq": 979137,
  6. "vip": 8,
  7. "level": 101,
  8. "reg_time": 1377123144,
  9. "qb": 300
  10. },
  11. "location": ""
  12. }

json具有很强的跨平台性,几乎每种语言都有解析json的函数,下面是一个PHP作为客户端调用的示例:

  1. <?php
  2. header('Content-type:text/html;charset=utf-8');
  3. $url = "http://demo.979137.com/api/test/user.php?a=info&qq=979137";
  4. $arg = array(
  5. 'a' => 'info',
  6. 'qq' => '979137',
  7. );
  8. $query_string = http_build_query($arg);
  9. $ch = curl_init($url.'?'.$query_string);
  10. curl_setopt($ch, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_1_1);
  11. curl_setopt($ch, CURLOPT_USERAGENT , 'QQ_Mobile_V5.5');
  12. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT , 60 );
  13. curl_setopt($ch, CURLOPT_TIMEOUT , 60);
  14. curl_setopt($ch, CURLOPT_RETURNTRANSFER , true);
  15. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  16. $response = curl_exec($ch);
  17. $httpcode = curl_getinfo($ch , CURLINFO_HTTP_CODE);
  18. curl_close($ch);
  19. if ($response === false) {
  20. var_dump(curl_error($ch));
  21. } elseif ($httpcode != 200) {
  22. var_dump($httpcode, '接口请求失败');
  23. } else {
  24. $ret = json_decode($response, true);
  25. var_dump($ret);
  26. }

页面输出结果:

  1. array(4) {
  2. ["code"]=>int(0)
  3. ["info"]=>string(7) "success"
  4. ["data"]=>
  5. array(5) {
  6. ["qq"]=>int(979137)
  7. ["vip"]=>int(8)
  8. ["level"]=>int(101)
  9. ["reg_time"]=>int(1377123144)
  10. ["qb"]=>int(300)
  11. }
  12. ["location"]=>string(0) ""
  13. }

实际项目中,我们在开发 API 时应该注意的几个点(仅供参考)

1、单文件实现多接口的形式有很多种,例如:if..elseif.. 或 switch 或 很多框架里用到的统一入口通过调用类函数的形式实现
2、数据输出建议使用json,json具有很强的跨平台性,大多编程语言都支持json解析,json正在逐步取代xml,成为网络数据的通用格式
3、为了保证接口安全,一定要加入鉴权体系
4、对于线上的API,务必关闭所有错误显示,可以把错误写到日志里,PHP中,可以通过 error_reporting(0) 屏蔽所有错误
这样做的目的,一方面是保护接口安全,防止输出不该打印的错误信息
另一方面是保证输出的是正确的数据格式,如json,假如不是标准的json格式,客户端在解析时就会出错,由此影响客户端的正常运转
PS:我们平时在使用手机APP时,手机会闪退,多半是这个原因,即接口调用异常
5、开发 API 和 WEB 有一定的区别,如果是 WEB 的话,如果程序写的有问题,比如有个notice 或 warning 级别的错误,在 WEB 里可能不会有什么问题,也许就只是导致 WEB 的某个部分错位或乱码。但如果是 API,就会严重调用的客户端了,如果是手机APP,那闪推啥的,是必然的,如果同样也是Web调用,也可能会出现  Server Error 了
6、一定要重点考虑稳定性和响应速度,因为我们在使用手机APP时,都不希望APP经常闪推、而且希望应用很流畅
7、不要随便使用一些 PHP 开源框架,原因概括起来有两点:
    1)如6所述,客户端一般对 API 响应速度有极高要求,目前PHP领域的开源框架非常多,根据笔者的了解,目前比较流行的框架,普遍做的比较重,而且基本都是为WEB而生,因此,框架多了很多 API 用不到的东西,框架在加载和执行冗余文件时,实际是在消耗你的性能
    2)如4和5所述,框架对于WEB开发,是件很幸福的事,但对于 API 而言,你实在不敢想象它会给你出什么岔子,因为很多框架并没有全面的考虑到 API 场景

API接口开发简述示例的更多相关文章

  1. API接口开发简述

    作为最流行的服务端语言PHP(PHP: Hypertext Preprocessor),在开发API方面,是很简单且极具优势的.API(Application Programming Interfac ...

  2. 示例浅谈PHP与手机APP开发,即API接口开发

    示例浅谈PHP与手机APP开发,即API接口开发 API(Application Programming Interface,应用程序接口)架构,已经成为目前互联网产品开发中常见的软件架构模式,并且诞 ...

  3. API接口开发 配置、实现、测试

    Yii2 基于RESTful架构的 advanced版API接口开发 配置.实现.测试 环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到 ...

  4. 浅谈使用 PHP 进行手机 APP 开发(API 接口开发)

    做过 API 的人应该了解,其实开发 API 比开发 WEB 更简洁,但可能逻辑更复杂,因为 API 其实就是数据输出,不用呈现页面,所以也就不存在 MVC(API 只有 M 和 C),那么我们来探讨 ...

  5. JAVA WEB接口开发简述

    目录 1. JAVA WEB接口开发简述 1.1. 基本了解 1.2. 提供接口 1.3. 调用接口 1. JAVA WEB接口开发简述 1.1. 基本了解 当我们想去访问其他网站的接口时候,而又不想 ...

  6. F5 api接口开发实战手册(二)

    F5 rest api 各对象使用方式详解 本篇文章介绍rest api接口下Collection.Resource.Subcollections.SubResource的各种使用方法.如果您不了解这 ...

  7. 利用postman进行api接口开发

    场景: api接口开发时,经常使用一些工具来帮助设计开发.Yapi主要是在设计阶段进行api接口设计,统一前后端参数请求和返回体:swagger主要在开发阶段,用来显示实际上后端开发进度和接口情况:p ...

  8. 快递单号查询免费api接口(PHP示例)

    快递单号查询API,可以对接顺丰快递查询,邮政快递查询,中通快递查询等.这些快递物流企业,提供了快递单号自动识别接口,快递单号查询接口等快递物流服务.对于电商企业,ERP服务企业,集成此接口到自己的软 ...

  9. SpringBoot RestFul风格API接口开发

    本文介绍在使用springBoot如何进行Restful Api接口的开发及相关注解已经参数传递如何处理. 一.概念: REST全称是Representational State Transfer,中 ...

随机推荐

  1. Canvas的方法覆盖和实现新的API

    有时候为了特定需求或者特殊目的,需要覆盖或者重写某个API,在Canvas中,就需要用到CanvasRenderingContext2D这个对象. CanvasRenderingContext2D为C ...

  2. Golang基于学习总结

    1.不支持继承 重载 ,比方C++Java的接口,接口的改动会影响整个实现改接口的类行为的改动,Go 设计者觉得这一特点也许根本没用. 2.必不论什么函数定义必须花括号跟在函数声明后面而不能换行 如 ...

  3. Codeforces 480C Riding in a Lift dp

    主题链接:点击打开链接 意甲冠军: 特定 n a b k 构造一个长度k该序列. 使得序列中 对于随意两个相邻的数 | w[i-1] - w[i] | < | w[i] - b | 且第一个数 ...

  4. atitit.无线上网卡 无法搜索WiFi 解决无线路由器信号不能被连接

    atitit.无线上网卡 无法搜索WiFi 解决无线路由器信号不能被连接 #---现象 pc机无线网卡无法搜索到无线路由器的信号.. 但是,笔记本电脑和手机能够... 只要pc机无线网卡可以搜索信号, ...

  5. OpenWrt配置opkg.conf

    傻人干活才累. 用openwrt有一年多了, 数据传输一直使用wget从外部的webserver取. 这样的方法我个人认为还算轻松. 可是调试的多了,写大型一点的程序,总是这样就有点麻烦了. 安装软件 ...

  6. 编写高质量JavaScript代码绳之以法(The Essentials of Writing High Quality JavaScript)翻译

    原文:The Essentials of Writing High Quality JavaScript 才华横溢的Stoyan Stefanov,在他写的由O'Reilly初版的新书<Java ...

  7. 十依据一个有用的算法来找到最小(最大)的k的数量-线性搜索算法

    例如:进入1.2.3,4,5,6.7.8此8数字,最小的4图的1,2,3,4. 思路1:最easy想到的方法:先对这个序列从小到大排序.然后输出前面的最小的k个数就可以.假设选择高速排序法来进行排序, ...

  8. 编译的依赖不能vs的release工程

    前言: 今天,我们正在做一个ocx插件的时候,放到刚装好win7系统的虚拟机上面注冊,弹出以下的一个错误提示: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQ ...

  9. eclipse环境下如何配置tomcat

    eclipse环境下如何配置tomcat 很多初学,尤其自学JavaWeb的朋友首次在eclipse下配置tomcat时,总会有种难下手的感觉,在此,通过图文解说的方法,最直观的向大家演示一遍该配置过 ...

  10. Zend_Db_Table::getDefaultAdapter is not working

    在Bootstrap中使用 $url = constant ( "APPLICATION_PATH" ) . DIRECTORY_SEPARATOR . 'configs' . D ...