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 媒体类型:返回值的数据类型

表面上,浏览器是根据文件后缀名获知返回值的数据类型,实际上,是依据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是数据的交换格式,与存储形式无关。可以采用内存变量、磁盘文件、网络字节流等各种方式进行跨系统交换

官方站点 http://www.json.org/json-zh.html

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等

其它数据交换格式

下一代json

Web模式的变迁

  • 1.0: Web站点,以文档为中心,html,超文本网络
  • 2.0: Web应用,以数据为中心,json/xml,可互通的软件网
  • 3.0: Web系统,以API为中心,JSON Schema/graphql,可编程的Web系统或平台

参考

results matching ""

    No results matching ""