当前位置: 首页 > news >正文

API安全之《大话:API的前世今生》

写在前面:本文结合API使用的业界现状,系统性地阐述API的基本概念、发展历史、表现形式等基础内容,主要包含以下内容:

1.什么是API

2.API的发展历史

3.现代API常用消息格式

4.top N 互联网企业API 使用现状

当前的世界是一个信息互联和共享的时代,互联网发展到今天,API技术已经被各个企业广泛接受和使用,并呈现逐年增长的趋势,尤其是在当前国内云大物移和新基建的背景下,没有一家企业敢说抛弃API技术,去构建独立的企业信息化系统或企业服务能力。

进入新世纪以来,数字化技术的高速发展,为人们提供高效和便捷的信息来源。这些信息来源,在后端的服务支撑上离不开API接口提供能力。换句话说,API技术已经成为互联网信息基础能力的一部分,涉及我们现实生活的方方面面。当我们出行时,需要使用地图的API进行定位;当我们查询天气时,需要调用天气预报的API获取当前天气;当我们网上购物时,页面会调用推广的API显示推广或促销商品列表。正是API技术的广泛使用,才使得不同的企业、不同的产品在业务能力上相互融入,为用户提供了丰富的信息和良好的体验。

说了这么多,那么到底什么是API呢?下面我们就一起来探讨它的含义。

一、什么是API

关于API的含义,业界一直没有明确的界定。之所以这么说,不是因为API这个词所表达的意思不明确,而是因为随着互联网技术的发展,API这个专有名词所最初所表达的含义它的外延在不断扩大,所包含的内容也越来越多。我们先来看看维基百科上对API的描述:

In computer programming, an Application Programming Interface (API) is a set of subroutine definitions, protocols, and tools for building application software. In general terms, it is a set of clearly defined methods of communication between various software components.

在这段描述,我们了解到 API又称为应用程序编程接口,是Application Programming Interface的简称,它通过定义一组函数、协议、数据结构,来明确应用程序中各个组件之间的通信与数据交互方式,通过接口的形式,将Web应用、操作系统、数据库以及计算机硬件或软件的能力提供给外部使用。其表现形式大致分为如下三种:

1.1.类库型API

此种类型的API通常是一个类库,它的使用依赖于特定的编程语言,开发者通过接口调用,访问API的内置行为,从而处理所需要的信息。例如,应用程序调用微软基础类库MFC。

图片

1.2.操作系统型API

此类的API通常是操作系统层对外部提供的接口,开发者通过接口调用,完成对操作系统行为的操作。例如,应用程序调用Windows API或linux标准库。

图片

1.3.远程应用型API

开发者通过标准协议方式,将不同的技术结合在一起,不用关心所涉及的编程语言或平台,来操纵远程资源。例如,在Java通过JDBC连接来操作不同类型的数据库。

图片

1.4.web应用型API

它通常使用http协议,在企业与企业之间、企业与不同的应用程序之间,通过web开发过程中架构设计的方法,以一组服务的形式,对外提供调用接口,以满足不同类型、不同服务的消费者的需求。例如,社交应用新浪微博的用户登录。

图片

从上述介绍我们可以看出,API这个专有名词的含义,已经从当初单一的类库或操作系统应用程序接口扩展到如今的平台型web API接口,这是商业发展和业务驱动技术在不断改进的结果。API已经从单纯的应用程序接口所定义的用于构建和集成应用程序软件的一组定义和协议,变成了业务交互所在的双方之间的技术约定,业务双方的产品或服务与其他产品和服务进行通信,不必知道对方是如何实现的。就像我们在生活中需要使用电,只要按照要求接上电源就会有电流过来,而不必知道电流的产生原理自己来发电。这样做的好处是大大地简化应用程序开发难度,节约了时间成本和资金成本。

二、API的发展历史

从API的定义中我们看出,API的产生主要为了解决互联网技术发展过程中不同组件之间通信所遇到问题的,在不同的阶段出现不同的API形态,它的发展伴随着互联网技术的发展,尤其是web技术的发展,在不停地变化着。当我们追溯API的发展历史前,我们先来了解一下web技术的发展历史。

图片

对于互联网的发展,业界通常有web 1.0到web 6.0的划分,但web技术本身的发展没有那么清晰的界线,其先后大体经历了四个阶段,分别如下:

web技术1.0时代:群雄逐鹿、先入为王的时代,技术形式以html静态网页为主。

web技术2.0时代:用户交互逐渐丰富,大量互联网应用产生,技术形式以动态网页为主。

web技术3.0时代:出现行业垂直细分,业务形态从PC互联网到WAP端、移动端、专用终端迁移,催生了大量的交互技术,其中API技术得到了快速发展。

web技术4.0时代:逐渐出现行业巨头通吃的局面,大数据、物联网开启万物互联的时代,平台型企业的崛起,容器、微服务、公有云等技术开创了API技术的新天地。

从web技术发展的4个阶段我们可以看出,API技术的快速发展是在web技术3.0时代开始的,那么从web技术3.0时代到今天,API技术到底发生了哪些改变呢?

在API出现的早期,API通常用于操作系统的库,其所在运行环境为系统本地的,这个阶段它的表现形式对应于上文提及的类库或操作系统型API。在系统本地环境使用这种现状,限制了API技术在很长一段时间内没有快速发展,直到动态网页技术的广泛使用才开始出现转机。

作为IT技术人员,我们都应该了解动态网页技术的基本原理,动态网页技术与静态网页技术最大的区别在于页面内容的动态性和可交互性。开发者使用CGI、ASP、PHP、JSP等技术,在浏览器界面,根据用户的要求和选择而发生动态改变和响应,这其中离不开网页端与数据库的通信交互,远程应用型API也就是在这样的背景下产生的。这个阶段API的、应用场景除了JDBC驱动的数据库调用外,还产生了大型应用程序的不同协议间的通信,比如Flex+Java应用之间的前后端通信;Spring 开发框架提供的多种远程调用模式:RMI、Hessian、Burlap、HttpInvoker、JAX RPC;以及EJB、Weblogic Tuxedo Connector(WTC)、CORBA、SOAP等。这些技术,在后来的发展中只有少数得以延续,大多数被新的API技术所取代,逐渐淹埋的历史的角落。其典型的应用场景如下:

1.EJB:EJB(Enterprise Java Bean)是JavaEE中面向服务的体系架构所提供的解决方案,开发者将业务功能封装在服务器端,以服务的形式对外发布,客户端在无需知道技术实现细节的情况下来完成远程方法的调用。

图片

2.RMI: RMI是Remote Method Invocation的缩写,主要是针对于java语言的,通过代码实现网络远程调用另一个JVM的某个方法,其底层实现依赖于序列化和反序列化,容易出现严重的安全漏洞。

图片

3.SOAP:在SOAP协议类型里,使用最多的是WebService服务,其通过WSDL文件描述,以服务接口的形式对外提供软件能力[1]。

图片

进入2000年以后,整个社会的数字化环境发生了巨大的变革,面对在瞬息万变的市场环境,业务团队和IT团队为了满足快速变化的业务需求不得不互相协作,以保证企业的竞争力,EJB、WTC这类笨重的技术逐渐被抛弃,与微服务、容器化技术架构兼容性好且轻量级的RESTFul API技术开始占据上风,并逐步成为主流。关于这一点,我们也可以通过近十年的百度趋势指数侧面验证。

图片

在API技术的发展历史中,我们把前两个阶段的API称为古典API,后两个阶段称为现代API,现代API是当前API技术的主要使用形式,它们使用不同的通信协议或消息格式,构成了精彩的API技术世界。

三、现代API常用消息格式

现代API的崛起要追溯到2000年,现在API的奠基人Roy Fielding博士在他的论文《架构风格以及基于网络的软件架构设计》(Architectural Styles and the Design of Network-based Software Architectures)中第一次提到REST概念,其目的是满足现代Web架构的设计与开发的需要;而之后,Leonard  Richardson 提出「REST成熟度模型」,该模型把 REST 服务按照成熟度划分成 4 个层次【2】:

Level 0: Web 服务使用 HTTP 作为传输方式,实际上是远程方法调用(RPC)的雏形,SOAP 和 XML-RPC 都属于此类,其表现形式为一个URI,一个HTTP方法。

Level 1: Web 服务引入了资源的概念,每个资源有对应的标识符和表述。其表现形式为多个URI,一个HTTP方法。例如:

http://www.wordpress.com/theme?tpl=WDone2

http://www.wordpress.com/plugin/theme?tpl=WDone1

Level 2: Web 服务使用不同的 HTTP 方法来进行不同的操作,并且使用 HTTP 状态码来表示不同的结果。如 HTTP GET 方法来获取资源,HTTP DELETE 方法来删除资源,这是当前使用范围最为广泛的层次。其表现形式为多个URI,多个HTTP方法。例如:

GET  http://www.wordpress.com/user?id=2 获取用户信息

DELETE  http://www.wordpress.com/user?id=2 删除用户信息

POST http://www.wordpress.com/user 创建用户

Level 3:Web 服务使用 HATEOAS,在资源的表述中包含了链接信息,客户端可以根据链接来发现可以执行的动作。比较理想的层级,目前实际应用较少。

从「REST成熟度模型」中各个层次的含义来看,目前大多数应用基本都停留在Level1~Level2 的层次,所以在后续的内容中,我们重点讲围绕这两个层级去讨论API及其安全性。

在现行的API规范中,OpenAPI当之无愧的排在首位,官网地址为:https://swagger.io/specification/。从其其官方文档我们了解到:OpenAPI规范是在2015年由OpenAPI Initiative捐赠给Linux基金会的,其规范内容为RESTful API定义了一个与语言无关的标准接口,可通过有效映射与之关联的所有资源和操作来轻松开发和使用API,而无需访问源代码,文档或通过网络流量检查。使用者可以用最少的实现逻辑来理解远程服务并与之交互;文档生成工具可以使用OpenAPI定义来显示API;代码生成工具可以使用各种编程语言、测试工具和其他用例来生成服务器和客户端。

OpenAPI规范主要有两个版本:OAS2.0与OAS3.0 。其消息格式在HTTP协议的基础上,采用的MIME类型以json格式为主,通常有:

图片

同时,在规范中我们也看到了,关于身份认证的安全性支持方案包括apiKey、http basic、oauth2、openIdConnect、JWT等。

四、TOP N 互联网企业API 使用现状

API技术的发展加速了API的广泛使用,而API的广泛使用又促进API技术的发展。在国外,继Facebook的开放平台获得成功之后,微软、google也推出了自己的开放平台战略。而国内在2010年前后,头部的互联网公司相继开放了自己的API平台,典型的有微博、百度、腾讯、盛大等。腾讯开放平台在《2015年互联网+白皮书》中[3],列举了其地图开放平台为开发者提供JS API、SDK 、WebService接口等多种API调用方式。

图片

2019年12月10日,百度地图生态大会公开的报告[4]显示,其位置服务请求次数已突破1200亿次。

图片

时至今日,如果你去搜索引擎搜一下OpenAPI开放平台,会出现很多企业都在使用API开放平台。

图片

目前,API技术已经渗透到各行各业,随着物联网和5G技术的迅速发展,各种新业务能力的API在不断地涌现,API技术正迎来蓬勃向上的春天。在如此良好的前景下,当前的API应用有哪些安全问题呢?这将是我们在下一篇内容中讨论的重点内容。

相关文章:

API安全之《大话:API的前世今生》

写在前面:本文结合API使用的业界现状,系统性地阐述API的基本概念、发展历史、表现形式等基础内容,主要包含以下内容: 1.什么是API 2.API的发展历史 3.现代API常用消息格式 4.top N 互联网企业API 使用现状 当前的世界是一个信…...

H5或者Vue实现二维码识别

前言 1、扫码识别库采用开源的zxing/library 2、支持js&#xff0c;Vue&#xff0c;lit等实现 原文章地址和代码仓库地址 1、在界面创建video标签用来显示摄像头内容 <!-- 视区 --><!-- lit写法 --> <video ${ref(this.videoRef)} class"xy-scan-wrap…...

stm32整理(三)ADC

1 ADC简介 1.1 ADC 简介 12 位 ADC 是逐次趋近型模数转换器。它具有多达 19 个复用通道&#xff0c;可测量来自 16 个外部 源、两个内部源和 VBAT 通道的信号。这些通道的 A/D 转换可在单次、连续、扫描或不连续 采样模式下进行。ADC 的结果存储在一个左对齐或右对齐的 16 位…...

Redis-持久化+主从架构

文章目录 Redis的持久化RDB模式异步持久化的实现AOF模式总结 Redis的主从架构1.端口以及文件调试测试2.主从配置3.数据同步原理&#xff08;第一次同步为全局同步&#xff09;4.增量同步5.主从配置优化6.问:master主机怎么判断从机slave是不是第一次同步数据&#xff1f; Redis…...

STM32H750之FreeRTOS学习--------(四)中断管理

四、FreeRTOS中断管理 中断的概念不再过多叙述&#xff0c;学习过逻辑的都知道 中断的执行过程 中断请求 外设产生中断请求&#xff08;GPIO外部中断、定时器中断等&#xff09;响应中断 CPU停止执行当前程序&#xff0c;转而去执行中断处理程序&#xff08;ISR&#xff09;…...

Macroscope安全漏洞检测工具简介

学习目标&#xff1a; 本介绍旨在帮助感兴趣者尽快了解 Macroscope&#xff0c;这是一款用于安全测试自动化和漏洞管理的企业工具。 全覆盖应用程序安全测试&#xff1a; 如下图所示&#xff0c;如果使用多种互补工具&#xff08;SAST/DAST/SCA 等&#xff09;来检测应用程序…...

【Linux】Nignx的入门使用负载均衡动静分离(前后端项目部署)---超详细

一&#xff0c;Nignx入门 1.1 Nignx是什么 Nginx是一个高性能的开源Web服务器和反向代理服务器。它使用事件驱动的异步框架&#xff0c;可同时处理大量请求&#xff0c;支持负载均衡、反向代理、HTTP缓存等常见Web服务场景。Nginx可以作为一个前端的Web服务器&#xff0c;也可…...

【入门Flink】- 04Flink部署模式和运行模式【偏概念】

部署模式 在一些应用场景中&#xff0c;对于集群资源分配和占用的方式&#xff0c;可能会有特定的需求。Flink为各种场景提供了不同的部署模式&#xff0c;主要有以下三种&#xff1a;会话模式&#xff08;Session Mode&#xff09;、单作业模式&#xff08;Per-Job Mode&…...

react面试要点

# React面试知识点 ## React是什么&#xff1f;谈一谈你对react的理解 1 React是一个网页UI库 2 react的特点是 声明式 组件化 通用性 3 react优点&#xff1a; 简单&#xff0c;低耦合高内聚&#xff0c;由于虚拟dom概念&#xff0c;可以做到一次学习到处使用。 …...

在Google Kubernetes集群创建分布式Jenkins(一)

因为项目需要&#xff0c;在GKE的集群上需要创建一个CICD的环境&#xff0c;记录一下安装部署一个分布式Jenkins集群的过程。 分布式Jenkins由一个主服务器和多个Agent组成&#xff0c;Agent可以执行主服务器分派的任务。如下图所示&#xff1a; 如上图&#xff0c;Jenkins Ag…...

【Python全栈_公开课学习记录】

一、初识python (一).Python起源 Python创始人为吉多范罗苏姆&#xff08;荷兰&#xff09;&#xff0c;Python崇尚优美、清晰、简明的编辑风格。Python语言结构清晰简单、数据库丰富、运行成熟稳定&#xff0c;科学计算统计分析领先。目前广泛应用于云计算、Web开发、科学运算…...

uniapp循环列表单选框实现单选

目录 图片源码参考最后 图片 源码 参考 大佬 最后 感觉文章好的话记得点个心心和关注和收藏&#xff0c;有错的地方麻烦指正一下&#xff0c;如果需要转载,请标明出处&#xff0c;多谢&#xff01;&#xff01;&#xff01;...

【强化学习】14 —— A3C(Asynchronous Advantage Actor Critic)

A3C算法&#xff08; Asynchronous Methods for Deep Reinforcement Learning&#xff09;于2016年被谷歌DeepMind团队提出。A3C是一种非常有效的深度强化学习算法&#xff0c;在围棋、星际争霸等复杂任务上已经取得了很好的效果。接下来&#xff0c;我们先从A3C的名称入手&…...

Google单元测试sample分析(四)

GoogleTest单元测试可用实现在每个测试用例结束后监控其内存使用情况&#xff0c; 可以通过GoogleTest提供的事件侦听器EmptyTestEventListener 来实现&#xff0c;下面通过官方提供的sample例子&#xff0c;路径在samples文件夹下的sample10_unittest.cpp // Copyright 2009…...

网络套接字编程(二)

网络套接字编程(二) 文章目录 网络套接字编程(二)简易TCP网络程序服务端创建套接字服务端绑定IP地址和端口号服务端监听服务端运行服务端网络服务服务端启动客户端创建套接字客户端的绑定和监听问题客户端建立连接并通信客户端启动程序测试单执行流服务器的弊端 多进程版TCP网络…...

LLaMA-Adapter源码解析

LLaMA-Adapter源码解析 伪代码 def transformer_block_with_llama_adapter(x, gating_factor, soft_prompt):residual xy zero_init_attention(soft_prompt, x) # llama-adapter: prepend prefixx self_attention(x)x x gating_factor * y # llama-adapter: apply zero_init…...

JavaScript设计模式之发布-订阅模式

发布者和订阅者完全解耦&#xff08;通过消息队列进行通信&#xff09; 适用场景&#xff1a;功能模块间进行通信&#xff0c;如Vue的事件总线。 ES6实现方式&#xff1a; class eventManager {constructor() {this.eventList {};}on(eventName, callback) {if (this.eventL…...

mysql---索引

概要 索引&#xff1a;排序的列表&#xff0c;列表当中存储的是索引的值和包含这个值的数据所在的行的物理地址 作用&#xff1a;加快查找速度 注&#xff1a;索引要在创建表时尽量创建完全&#xff0c;后期添加影响变动大。 索引也需要占用磁盘空间&#xff0c;innodb表数据…...

微信小程序——简易复制文本

在微信小程序中&#xff0c;可以使用wx.setClipboardData()方法来实现复制文本内容的功能。以下是一个示例代码&#xff1a; // 点击按钮触发复制事件 copyText: function() {var that this;wx.setClipboardData({data: 要复制的文本内容,success: function(res) {wx.showToa…...

【51单片机】矩阵键盘与定时器(学习笔记)

一、矩阵键盘 1、矩阵键盘概述 在键盘中按键数量较多时&#xff0c;为了减少I/O口的占用&#xff0c;通常将按键排列成矩阵形式 采用逐行或逐列的“扫描”&#xff0c;就可以读出任何位置按键的状态 2、扫描的概念 数码管扫描&#xff08;输出扫描&#xff09;&#xff1a;…...

vue 中使用async await

在程序中使用同步的方式来加载异步的数据的方式: async function() {let promise new Promise((resolve, reject) > {resolve(res);}).then(re > {return re; });await promise; }...

C语言学习之内存区域的划分

内存区域的划分:32位OS可以访问的虚拟内存空间为0~4G&#xff1b;一、内核空间&#xff1a;3~4G;二、用户空间0~3G;栈区&#xff1a;局部变量在栈区分配、由OS负责分配和回收堆区&#xff1a;由程序员手动分配&#xff08;malloc函数&#xff09;和回收(free函数)&#xff1b;静…...

Unity Animator cpu性能测试

测试案例&#xff1a; 场景中共有4000个物体&#xff0c;挂在40个animtor 上&#xff0c;每个Animator控制100个物体的动画。 使用工具&#xff1a; Unity Profiler. Unity 版本&#xff1a; unity 2019.4.40f1 测试环境&#xff1a; 手机 测试过程&#xff1a; 没有挂…...

数据结构 - 顺序表ArrayList

目录 实现一个通用的顺序表 总结 包装类 装箱 / 装包 和 拆箱 / 拆包 ArrayList 与 顺序表 ArrayList基础功能演示 add 和 addAll &#xff0c;添加元素功能 ArrayList的扩容机制 来看一下&#xff0c;下面的代码是否存在缺陷 模拟实现 ArrayList add 功能 add ind…...

【Echarts】玫瑰饼图数据交互

在学习echarts玫瑰饼图的过程中&#xff0c;了解到三种数据交互的方法&#xff0c;如果对您也有帮助&#xff0c;不胜欣喜。 一、官网教程 https://echarts.apache.org/examples/zh/editor.html?cpie-roseType-simple &#xff08;该教程数据在代码中&#xff09; import *…...

k8s、pod

Pod k8s中的port【端口&#xff1a;30000-32767】 port &#xff1a;为Service 在 cluster IP 上暴露的端口 targetPort&#xff1a;对应容器映射在 pod 端口上 nodePort&#xff1a;可以通过k8s 集群外部使用 node IP node port 访问Service containerPort&#xff1a;容…...

一天掌握python爬虫【基础篇】 涵盖 requests、beautifulsoup、selenium

大家好&#xff0c;我是python222小锋老师。前段时间卷了一套 Python3零基础7天入门实战 以及1小时掌握Python操作Mysql数据库之pymysql模块技术 近日锋哥又卷了一波课程&#xff0c;python爬虫【基础篇】 涵盖 requests、beautifulsoup、selenium&#xff0c;文字版视频版。1…...

睿趣科技:想知道开抖音小店的成本

随着互联网的发展&#xff0c;越来越多的人开始尝试通过开设网店来创业。抖音作为目前最受欢迎的短视频平台之一&#xff0c;也提供了开店的功能。那么&#xff0c;开一家抖音小店需要多少成本呢&#xff1f; 首先&#xff0c;我们需要了解的是&#xff0c;抖音小店的开店费用是…...

python项目部署代码汇总:目标检测类、人体姿态类

一、AI健身计数 1、图片视频检测 &#xff08;cpu运行&#xff09;&#xff1a; 注&#xff1a;左上角为fps&#xff0c;左下角为次数统计。 1.哑铃弯举&#xff1a;12&#xff0c;14&#xff0c;16 详细环境安装教程&#xff1a;pyqt5AI健身CPU实时检测mediapipe 可视化界面…...

力扣每日一题92:反转链表||

题目描述&#xff1a; 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4 输…...