一文搞懂什么是 API
在我学习软件开发之前,API 听起来像是一种啤酒(IPA,印度淡色艾尔)。如今我经常使用这个术语,事实上最近我还尝试在酒吧里点了一个 API,结果酒保给了我一个:
404 资源未找到的回应
无论是在科技行业还是其他地方,我遇到很多人对这个相当普遍的术语有着模糊的理解。从技术上讲,API 代表应用程序编程接口,大多数大公司都曾为客户或内部使用构建过 API。但如何用简单的语言来解释 API 呢?除了开发和商业中使用的定义外,是否还有更广泛的含义?首先,让我们退后一步看看网络本身是如何运作的。
1、万维网和远程服务器
当我想到网络时,我会想象一个由连接在一起的服务器组成的庞大网络。互联网上的每个页面都存储在某个远程服务器上。远程服务器其实并不神秘——它只是位于远程计算机中的一部分,专门用于处理请求。
为了更好地理解这个概念,你可以在自己的笔记本电脑上启动一个能够将整个网站提供给互联网使用的服务器(事实上,在将网站发布给公众之前,工程师们就是使用本地服务器进行开发)。
当你在浏览器中输入 www.baidu.com 时,一个请求被发送到 Baidu 的远程服务器。一旦你的浏览器收到响应后,它会解析代码并显示页面。对于浏览器(也称为客户端)来说,Baidu 的服务器就是一个 API。这意味着每次访问 Web 上的页面时,您都与某个远程服务器的 API 进行交互。
API 并不等同于远程服务器——而是指接收请求和发送响应的那部分。
2、将 API 作为服务客户的途径
您可能听说过公司将 API 打包成产品,例如,Weather Underground 出售其天气数据 API 的访问权限。示例场景:
您的小型企业网站上有一个用于给客户预约的表单,您希望让客户能够自动在 Google 日历中创建一个包含该预约详细信息的事件。
API 使用:想法是让您网站的服务器直接与谷歌服务器进行通信,请求创建具有给定详细信息的事件。然后,您的服务器会收到谷歌发回来、处理它并向浏览器发送相关信息(如用户确认消息)。或者,你可以直接通过你自己服务器向谷歌服务器发送 API 请求。
这个 Google 日历 API 与其他远程服务器 API 的区别是什么?
从技术角度看, 区别在于请求和响应格式。 要呈现整个网页,浏览器需要 HTML 格式响应, 其中包含表示代码;而 Google 日历 ****API 调用只返回数据——可能以 JSON 格式返回。
如果你们网站服务端正在发起 API 请求,则意味着你们网站服务端就是客户端(类似于当你使用浏览器导航至某个网站时,浏览器就变成了客户端)。
从用户角度来看,API 允许他们在不离开您的网站的情况下完成操作,大多数现代网站都使用了一些第三方 API。而且,许多问题已经有了第三方解决方案,无论是以库还是服务的形式。通常使用现有解决方案更容易、更可靠。开发团队将他们的应用程序分成多个通过 API 相互通信的服务器并不罕见。为主应用程序服务器执行辅助功能的服务器通常被称为微服务。
总之,当公司向客户提供 API 时,这意味着他们构建了一组专用 URL,返回纯数据响应——也就是说响应中不会包含像图形用户界面(如网站)那样具有表现性负担的内容。你可以用浏览器发起这些请求吗?往往可以。由于实际 HTTP 传输以文本进行, 浏览器会尽最大可能显示响应。
例如,你甚至可以在没有访问令牌情况下直接通过浏览器访问 GitHub API,当您在浏览器中访问 GitHub 用户 API
{
"login": "petrgazarov",
"id": 5581195,
"avatar_url": "https://avatars.githubusercontent.com/u/5581195?v=3",
"gravatar_id": "",
"url": "https://api.github.com/users/petrgazarov",
"html_url": "https://github.com/petrgazarov",
"followers_url": "https://api.github.com/users/petrgazarov/followers",
"following_url": "https://api.github.com/users/petrgazarov/following{/other_user}",
"gists_url": "https://api.github.com/users/petrgazarov/gists{/gist_id}",
"starred_url": "https://api.github.com/users/petrgazarov/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/petrgazarov/subscriptions",
"organizations_url": "https://api.github.com/users/petrgazarov/orgs",
"repos_url": "https://api.github.com/users/petrgazarov/repos",
"events_url": "https://api.github.com/users/petrgazarov/events{/privacy}",
"received_events_url": "https://api.github.com/users/petrgazarov/received_events",
"type": "User",
"site_admin": false,
"name": "Petr Gazarov",
"company": "PolicyGenius",
"blog": "http://petrgazarov.com/",
"location": "NYC",
"email": "petrgazarov@gmail.com",
"hireable": null,
"bio": null,
"public_repos": 23,
"public_gists": 0,
"followers": 7,
"following": 14,
"created_at": "2013-10-01T00:33:23Z",
"updated_at": "2016-08-02T05:44:01Z"
}
浏览器很好地显示了一个 JSON 响应,像这样的 JSON 已经可以在您的代码中使用了。从这段文字中提取数据非常容易,然后您可以随意处理这些数据。
3、A 代表“应用程序”
在结束之前,让我们再举几个 API 的例子。“应用程序”可以指很多东西。以下是 API 语境中的一些示例:
- 具有明确功能的软件。
- 整个服务器、整个应用程序或仅仅是一个小部分的应用程序。
基本上任何可以从其环境中明确区分出来的软件都可以成为 API 中的“A”,并且可能也会有某种类型的 API。 假设您在代码中使用了第三方库,一旦合并到您的代码中,库就成为了您整体应用程序的一部分。作为一个独特的软件,该库可能具有允许与您其他代码交互操作所需 API。
另一个例子:在面向对象设计(Object Oriented Design)中,代码被组织成对象。你们可能拥有数百个已定义好可相互交互操作对象。每个对象都具备 API —— 一套公共方法和属性供它与你们其他对象进行交互操作。此外, 对象内部逻辑也可能设置私密性质, 这意味着它对外界范围隐藏起来(不属于 API)。
通过我们所涵盖内容, 希望大家能够更深入理解 API 的广义概念以及现今常见术语运用方式。
Eolink Apikit -跨平台(Windows、Mac、Linux、Browsers...)的 API 开发测试工具,支持 REST、Websocket、gRPC、TCP、UDP、SOAP等协议,结合 API 设计、文档管理、自动化测试、监控、研发管理和团队协作的一站式 API 生产平台。
初创团队免费申请通道:https://easy-open-link.feishu.cn/share/base/form/shrcnpMe5dWtOkq2GoRWQ97oLlc
一文搞懂什么是 API的更多相关文章
- 一文搞懂 Promise 新 Api allSettled 的用法和 all 区别,以及如何在不支持新特性的环境下实现一个 Polyfill
开始 一文搞懂 Promise 新 Api allSettled 的用法和 all 区别,以及如何在不支持新特性的环境下实现一个 Polyfill allSettled 的用法 const runAl ...
- 一文搞懂RAM、ROM、SDRAM、DRAM、DDR、flash等存储介质
一文搞懂RAM.ROM.SDRAM.DRAM.DDR.flash等存储介质 存储介质基本分类:ROM和RAM RAM:随机访问存储器(Random Access Memory),易失性.是与CPU直接 ...
- 基础篇|一文搞懂RNN(循环神经网络)
基础篇|一文搞懂RNN(循环神经网络) https://mp.weixin.qq.com/s/va1gmavl2ZESgnM7biORQg 神经网络基础 神经网络可以当做是能够拟合任意函数的黑盒子,只 ...
- 一文搞懂 Prometheus 的直方图
原文链接:一文搞懂 Prometheus 的直方图 Prometheus 中提供了四种指标类型(参考:Prometheus 的指标类型),其中直方图(Histogram)和摘要(Summary)是最复 ...
- Web端即时通讯基础知识补课:一文搞懂跨域的所有问题!
本文原作者: Wizey,作者博客:http://wenshixin.gitee.io,即时通讯网收录时有改动,感谢原作者的无私分享. 1.引言 典型的Web端即时通讯技术应用场景,主要有以下两种形式 ...
- 一文搞懂vim复制粘贴
转载自本人独立博客https://liushiming.cn/2020/01/18/copy-and-paste-in-vim/ 概述 复制粘贴是文本编辑最常用的功能,但是在vim中复制粘贴还是有点麻 ...
- 三文搞懂学会Docker容器技术(中)
接着上面一篇:三文搞懂学会Docker容器技术(上) 6,Docker容器 6.1 创建并启动容器 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] --na ...
- 三文搞懂学会Docker容器技术(下)
接着上面一篇:三文搞懂学会Docker容器技术(上) 三文搞懂学会Docker容器技术(中) 7,Docker容器目录挂载 7.1 简介 容器目录挂载: 我们可以在创建容器的时候,将宿主机的目录与容器 ...
- 一文搞懂所有Java集合面试题
Java集合 刚刚经历过秋招,看了大量的面经,顺便将常见的Java集合常考知识点总结了一下,并根据被问到的频率大致做了一个标注.一颗星表示知识点需要了解,被问到的频率不高,面试时起码能说个差不多.两颗 ...
- 一文搞懂 js 中的各种 for 循环的不同之处
一文搞懂 js 中的各种 for 循环的不同之处 See the Pen for...in vs for...of by xgqfrms (@xgqfrms) on CodePen. for &quo ...
随机推荐
- CSS样式中颜色与颜色值的应用
使用CSS描绘页面样式时,颜色是其中不可或缺的,无论是对文本.背景还是边框.阴影,我们都写过无数代码用来增添颜色.而为了让网页的色彩表现更出色,我们很有必要完整梳理下CSS中的色彩. 要讲清楚CSS中 ...
- SpringBoot 整合 JDBC 实例
0.数据库表 CREATE DATABASE springboot; USE springboot; CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_ ...
- 帝国cms sql检则标题重复
<?php //检则标题重复 $sql=$empire->query("select id,filename from phome_ecms_news where classid ...
- C++重载的奥义之运算符重载
0.引言 重载,顾名思义从字面上理解就是重复装载,打一个不恰当的比方,你可以用一个篮子装蔬菜,也可以装水果或者其它,使用的是同一个篮子,但是可以用篮子重复装载的东西不一样. 正如在之前的文章<重 ...
- 最热学习🤩:ChatGPT从入门到应用!
4 月 25 日,我们将联合 Datawhale 团队组织 AIGC 主题学习活动「ChatGPT 从入门到应用」,欢迎大家参加! Datawhale 社区介绍 Datawhale 是一个专注于数据科 ...
- C# 当前进程是否有控制台窗口
WPF应用程序,在VS的项目属性中,可以设置输出类型: 那我们在代码中,如何判断应用的类型呢.有没有控制台?是否Windows应用程序还是控制台应用程序? Kernel32下函数GetConsoleW ...
- 中国剩余定理(CRT)学习笔记
约定 \(A\perp B\) 表示 \(\gcd(A,B)=1\). \(A\mid B\) 表示 \(B\equiv 0\pmod{A}(A\neq0)\). 引入 考虑以下这道题: 有物不知其數 ...
- Swagger之学习使用
前言 这个是为了介绍一下Swagger的使用,最近也在使用Swagger,就在下面这篇文章介绍下,我特地改了上次分享的外卖项目,添加了Swagger注解- 添加依赖 Maven项目添加依赖 <d ...
- 2021-02-08:给定一个字符串str,请问这个字符串的最长回文子序列长度是多少?
2021-02-08:给定一个字符串str,请问这个字符串的最长回文子序列长度是多少? 福哥答案2021-02-08: 自然智慧即可.1.原序列和反序列求公共子序列.无代码.2.递归.有代码.3.动态 ...
- 2022-04-21:给定一个包含 [0,n) 中不重复整数的黑名单 blacklist, 写一个函数从 [0, n) 中返回一个不在 blacklist 中的随机整数, 对它进行优化使其尽量少调用系
2022-04-21:给定一个包含 [0,n) 中不重复整数的黑名单 blacklist, 写一个函数从 [0, n) 中返回一个不在 blacklist 中的随机整数, 对它进行优化使其尽量少调用系 ...