JSON
Web 函数:从程序员角度看网站
当用户访问 http://x.com/index.php?key=nba
实际相当于调用了以下的一个服务器端的函数
import 'x.com'
function index_php(key){
...
return html_document
}
- 命名空间(namespace)或包(package): http://x.com/
- 函数名: index.php
- 输入参数1: 形参key,实参nba,类型为字符串
- 输出参数 : 常见为字符串类型,如html/css/js/png/txt等
输入参数的数据类型总是为字符串类型,但必须经过URL编码
MIME 媒体类型:返回值的数据类型
- http://x.com/index.html => HTML文档
- http://x.com/style.css => 纯文本
- http://x.com/app.js => 纯文本
- http://x.com/bg.png => 二进制图片
- http://x.com/video.mp4 => 二进制视频
表面上,浏览器是根据文件后缀名获知返回值的数据类型,实际上,是依据Web服务器返回的Http包中的MIME头的值,从而进行相应的处理
- text/html、text/css、text/js、text/plain...
- image/png、audio/mpeg、video/mp4...
- application/json、application/javascript、application/ecmascript...
MIME 媒体类型(Multipurpose Internet Mail Extensions)是一个RFC标准,规定了http中常见的数据类型
浏览器协商
浏览器每一次访问服务端链接,相当于一次Web函数调用。浏览器会在发起调用时,告知服务端一些必要的信息
- 浏览器在发送http请求时,会在http请求头中,填写MIME字段,告知服务器它能够处理和渲染的文档类型
- Web服务器在处理请求时,会根据浏览器支持的文档类型,决定如何返回相应的文档类型、或降级或给出错误
- Web服务器进行响应即返回文档时,也会在Http响应头中填写MIME字段,告知浏览器该文档的类型
后缀名、MIME类型、浏览器行为
Web服务器(Apache/Nginx)的配置中,一般会默认将常见的后缀名与正确MIME类型相关联,然后将MIME写入HTTP的响应头中。 浏览器根据读取响应头中的MIME类型,决定如何渲染或解析。但你可以通过配置Web服务器,改变上述关联
譬如:某教学网站,当你访问 http://x.com/code/index.html
- 如果服务器在http响应头中设置MIME字段为
text/plain
,则浏览器访问时,将直接显示源代码,而不是渲染后的html文档 - 如果服务器设置MIME为
image/png
类型,则浏览器访问时,将渲染失败,因为这是一个格式无效的png文件 - 如服务器设置MIME为
text/html
类型,则浏览器访问后,将显示成功渲染后的html文档,而非源代码
这与windows下,默认双击不同后缀名的文件,启动不同的关联程序是同样的道理,你完全可以在操作系统中改变此默认关联
JSON: JavaScript Object Notation
text/html、text/css、text/js、text/plain...等文档类型本质上是字符串类型
- 如果函数调用者是浏览器,浏览器会进一步将这些字符串转化为DOM等类型,然后进行处理
- 如果函数调用者是程序员,希望返回值即具有丰富的数据类型和结构,但又便于简单处理。
JSON 即是一种一种轻量级的数据交换格式。
- 基于纯文本编码 plain text,易于跨语言、跨系统、跨平台
- 由javascript语言演化而来,看起来很像是js中的对象。但记住,json是数据,不是代码。
- json是数据的交换格式,与存储形式无关。可以采用内存变量、磁盘文件、网络字节流等各种方式进行跨系统交换
JSON 实例
// 服务端的index.php
// php 对象
$data = { 'tom'=>['black',true,7122634433221],'cat'=>["yellow",false,7122634433357] }
// 从代码(php对象) 转换为 数据(字符串),作为返回值给浏览器端
echo json_encode($data)
// '{"tom":["black",true,7122634433221],"cat":["yellow",false,7122634433357]}';
// 浏览器端的js脚本,假设将调用服务端index.php所获得的返回值存储于data变量中
let data = '{"tom":["black",true,7122634433221],"cat":["yellow",false,7122634433357]}';
// 从数据(字符串) 转换为 代码(js 对象)
let object = JSON.parse(data);
object.cat[0] = 'white';
// 从代码(js对象) 转换为 数据(字符串)
JSON.stringify(object);
// '{"tom":["black",true,7122634433221],"cat":[["white"],false,7122634433357]}'
示例中JSON类常量是Javascript内置的序列化和反序列化库 问题:程序员如何编写js脚本,自行调用index.php?
跨进程调用
- 从一个语言中去调用另一个语言的代码或数据对象,称之为跨语言调用或通信
- 不同的语言编译后的程序运行在不同的进程空间,彼此之间相互调用或通信则称之为进程间调用(IPC inter process call)
- 典型的IPC机制,如共享内存、管道、剪贴板、文件导入导出等
- 如果两个进程位于同一机器中,则称之为本地跨进程调用(LPC local process call)
- 如果两个进程位于不同的机器中,则称之为远程过程调用(RPC remote process call )
- WEB应用中:前端js程序(浏览器)与后端PHP脚本(WEB服务器)通常不位于同一台机器,浏览器端的每一次访问即相当于一次RPC函数调用,其涉及
- 通信协议: http、grpc等
- 数据交换格式: json、html、xml等
- 应用控制协议: uri、mime、cookie等
其它数据交换格式
- html: 适合语义文档
- csv : 适合二维类简单文本数据
- xml: 功能强大,适合表达编程语言中的各种数据类型及对象,因而十分复杂
- yaml 和json一样轻量,但采用标记语言风格,更易程序员书写
- toml 对yaml的扩展
- 综合介绍与比较 http://www.mamicode.com/info-detail-2344150.html
下一代json
- HanSON
- SON
- JSONX
- Apache Avro 与编程语言无关的序列化格式
- more https://github.com/json-next/awesome-json-next
Web模式的变迁
- 1.0: Web站点,以文档为中心,html,超文本网络
- 2.0: Web应用,以数据为中心,json/xml,可互通的软件网
- 3.0: Web系统,以API为中心,JSON Schema/graphql,可编程的Web系统或平台