23.2  接口实现的基础

大家都很了解函数在本地应用,通过名称调用函数执行,并通过传递不同参数,函数有不同执行,执行后给调用者返回结果。如果把一个函数做成一个接口远程访问,也需要这几个步骤。使用HTTP的GET或POST等,通过URL并附带参数请求接口,接口执行后将返回值传回远端的调用者。请求者可以是浏览器,可以是PHP或其他语言程序,也可以是页面中的Ajax等。当然,接口返回值的格式也是统一的,要让各种语言和设备的请求者可以操作,通常使用XML或JSON格式作为返回数据。

23.2.1  实现接口的访问流程

下面,我们实现一个简单的开放接口,构建一个函数通过指定ID获取一条数据返回。模拟一张简单用户数据表“user”,并插入几条数据。模拟MySQL数据库中user表的3条数据如表23-1所示。

表23-1 模拟MySQL数据库中user表的3条数据

在Web服务器中,创建一个名为“userapi.php”的脚本文件。文件中声明一个show()函数,用于从数据表“user”中获取一条指定的记录。代码如下所示:

在上面的代码中,如果用户通过URL传递正确的id参数,可以获取user表中对应的一条记录,并以关联数组格式返回。如果参数传递不正确或数据表中没有查找到数据,则也以数组格式返回相应的错误码和错误消息。通过浏览器访问接口文件演示如图23-6所示。

图23-6  通过浏览器访问接口文件演示

本例其实算不上实现一个开放接口,就是用浏览器远程访问一个PHP函数,所以还需要对本例继续进行加工,本例只是让读者了解基本的接口访问流程。

23.2.2  处理接口的返回值

上例中,接口返回的是PHP数组,使用浏览器显示给用户没有问题,但如果能遍历数组加上格式输出就更好了。如果不是浏览调用接口,而是在别的PHP程序中或其他编程语言中,以及App中调用这个接口,返回PHP数组格式不一定合适。接口的返回数据格式,一定要让所有的编程语言都可以解析。通常使用XML或JSON作为数据交互格式。下面,简单介绍这两种格式及其使用方法。

Ø XML格式

扩展标记语言(Extensible Markup Language,XML),用于标记电子文件,使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML使用DTD(文档类型定义,Document Type Definition)来组织数据,格式统一,跨平台和语言,早已成为业界公认的标准。XML非常适合Web传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。一条用户信息使用XML语言定义如下:

将上例userapi.php文件进行简单修改,输出XML格式的数据,作为接口的返回值。PHP将数组转换成XML格式的方法有很多,最简单的办法是遍历数组,然后将数组元素中的“下标”和“值”转换成XML节点,再直接输出,修改后代码片段如下所示:

在上例中,自定义一个函数arrayToXml(),用于将数组转换成XML格式。同样使用浏览器通过正确的URL测试,会在浏览器中显示一条XML格式的用户信息。如果URL中没有带ID参数,或数据库中没有对应的数据,在浏览器中也会用XML格式显示错误信息。如果在其他平台或语言中访问同样的URL,也可以操作这样XML格式的数据。

Ø JSON格式

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,具有良好的可读性和便于快速编写的特性,可在不同平台之间进行数据交换。JSON采用兼容性很高的、完全独立于语言的文本格式,同时也具备类似于所有编程语言体系的行为。这些特性使JSON成为理想的数据交换语言。一条用户信息使用JSON格式定义如下所示。

中文和特殊符号返回的结果会转成unicode编码:

用户信息:

{"id":"1","username":"\u9ad8\u6d1b\u5cf0","sex":"\u7537","age":"30","description":"\u5f88\u5e05"}

错误消息:

{"errorno":"SN002","errormsg":"\u53c2\u6570ID\u9519\u8bef\uff01"}

将上例userapi.php文件进行简单修改,输出JSON格式,作为接口的返回值。PHP函数库中自带一个json_encode()函数,可以直接将数组转换成JSON格式的字符串。修改后代码片段如下所示:

使用同样的方法进行测试,在其他平台或语言中访问相同的URL,也可以操作这样JSON格式的数据。

JSON和 XML非常相似,它们都试图通过建立一种简单、人类可读的格式存储数据,让所有编程语言都可以处理,也都可以作为接口的数据返回值,在接口中应用也都能跨平台和语言。JSON在过去几年中已变得非常受欢迎,虽然可读性比XML略差一些,但存储和传输相同的信息,JSON确实需要更少的空间,解析速度更快。另外,JSON在设计时是为Web考虑的,所以它在JavaScript中使用得很好,很容易用JSON中的信息填充一个Web页面。本章仅列出以JSON格式作为接口返回值的使用案例。

《细说PHP》第四版 样章 第23章 自定义PHP接口规范 3的更多相关文章

  1. 《细说PHP》第四版 样章 第二章 PHP的应用与发展 1

    <细说PHP>第四版 样章 第二章 PHP的应用与发展 1 学习任何编程语言之前,先了解一下它的应用与发展是很有必要的.从Web开发的历史看来,PHP.Python和Ruby几乎是同时出现 ...

  2. 《java编程思想(第四版)》第一二章学习笔记

    目录 一.Introduction 1.抽象过程 2.面向对象语言(包括Java)的五个基本特性 3.每个对象都提供服务 4.public.private.protected三者的区别 5.Java的 ...

  3. 《细说PHP》 第四版 样章 第二章 PHP的应用与发展 5

    2.5  如何学习PHP PHP以其简单易学的特点,以及敏捷开发的优势,从一个几乎不被人知的开源项目,慢慢成长为技术人员首选的动态Web设计工具,与其他语言相比,PHP表现得更好.更快.更简单易学.尽 ...

  4. 《细说PHP》第四版 样章 第23章 自定义PHP接口规范 11

    23.6  使用第三方接口服务实例 接供服务的第三方接口平台有很多,现在的项目中也经常用到一些第三方接口,如支付宝.微信.短信.邮件接口等,我们需要借助第三方的能力来实现产品的某些功能.如果自己已经掌 ...

  5. 《细说PHP》第四版 样章 第23章 自定义PHP接口规范 9

    23.5.3  WebAPI框架应用 程序框架其实就是一个半成品项目,在应用框架时,核心的服务程序只应用,不需要改动.当然如果有必要,也可以根据项目的需要对框架进行二次开发.本节内容主要基于我们的框架 ...

  6. 《细说PHP》第四版 样章 第23章 自定义PHP接口规范 8

    23.5.2  架构详解 本例的实现最重要的就是服务层的设计,有两个配置文件config.php和api.php,其中文件config.php是全局的配置文件,用于整个程序全局需要的参数设置.可以根据 ...

  7. 《细说PHP》第四版 样章 第23章 自定义PHP接口规范 6

    23.4  API的设计原则和规范 API是服务提供方和使用方之间对接的通道,前面我们设计的一些简单API的例子,基本上比较随意,没有使用任何规范.设想一下,每个平台都可能存在大量的API,如果API ...

  8. 《细说PHP》第四版 样章 第23章 自定义PHP接口规范 1

    如今的项目开发中,接口是很普遍的应用技术.现在好多项目组都单独设有接口开发人员.像腾讯.微博.淘宝等开放平台,其所谓的开放,就是提供一些可调用的接口,用于获取相关的信息.例如,微信用户基本信息.淘宝店 ...

  9. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 12

    18.9  管理表books实例 在Web项目中,几乎所有模块都要和数据表打交道,而对表的管理无非就是增.删.改.查等操作,所以熟练掌握对表进行管理的这些常见操作是十分有必的.本例为了能更好地展示PD ...

随机推荐

  1. Redis中的Scan命令的使用

    Redis中有一个经典的问题,在巨大的数据量的情况下,做类似于查找符合某种规则的Key的信息,这里就有两种方式,一是keys命令,简单粗暴,由于Redis单线程这一特性,keys命令是以阻塞的方式执行 ...

  2. 【转载】Java程序模拟公安局人员管理系统

    编程题:公安人员的管理系统1) 学生类:a) 属性:i. 身份号—默认没有,需要手动进行输入ii. 姓名iii. 性别iv. 年龄v. 密码vi. 居住地址vii. 注册日期viii. 人员的信誉程度 ...

  3. Linux禁用root用户

    在创建各种云主机的时候,云服务商给的都是root用户,这很方便,但是有某些时候会造成一些困扰,日后在服务器上启动各种服务后,仅仅拥有root权限的用户才能访问更改这些服务,这样会造成一些不必要的困扰, ...

  4. Vue小练习 02

    用table标签渲染下面的数据, 最后一列为总分, 第一列为排名 scores = [ {name: 'Bob', math: 97, chinese: 89, english: 67}, {name ...

  5. Nginx 常用模块

    Nginx 常用模块 1. ngx_http_autoindex_module # ngx_http_autoindex_module模块处理以斜杠字符(' / ')结尾的请求,并生成一个目录列表. ...

  6. java并发编程-12个原子类

    背景 多线程更新变量的值,可能得不到预期的值,当然增加syncronized关键字可以解决线程并发的问题. 这里提供另外一种解决问题的方案,即位于 java.util.concurrent.atomi ...

  7. 分享学习 PHP 源码的方法

            ​每天抽一点时间来看看 PHP 源码方面的书,说实话,无法在调试器下观察 PHP 运行状态的上下文实在是一件痛苦的事情.不过还好不是一无所获,虽然内容比较多,但是掌握方法挨着看下去还是 ...

  8. go语言之用户输入&类型别名&类型转换

    1.用户输入 package main import "fmt" func main() { //用户输入,程序接受并输出 var v1 int //fmt.Println(&qu ...

  9. 什么是面向对象编程(OOP)?

    Java 程序员第一个要了解的基础概念就是:什么是面向对象编程(OOP)? 玩过 DOTA2 (一款推塔杀人的游戏)吗?里面有个齐天大圣的角色,欧洲战队玩的很溜,国内战队却不怎么会玩,自家人不会玩自家 ...

  10. Cypress 之 URL访问

    visit 作用: 访问一个远程URL. (建议:使用前设置 baseUrl) 语法: cy.visit(url) cy.visit(url, options) cy.visit(options) 使 ...