什么是api,如何去理解它?

最近我在知乎上看到一篇关于API介绍的文章,觉得挺有意思的,给大家分享一下 网址:https://www.zhihu.com/question/38594466?sort=created

www和远程服务器

当我想到网络的时候,我脑海中想象了一张巨大的连接服务网络
 
 
每一张页面都储存在远程服务器中,而一个远程服务器并不是那么的神秘,他就是一部分用来优化请求过程的远程计算机
 
 
为了能让事情更透明,你可以在你一台可以服务整个网站到网络上的手提电脑上启动一个服务器(事实上,一个本地服务器就是在发布到公众上之前工程师需要开发网站:注:其实这句话我不是很理解,翻译得乱七八糟,原文是:a local server is what engineers use to develop websites before releasing them to the public)
 
 
当你键入www.facebook.com进入你的浏览器并回车的时候,一个请求就去到了faceboook的远程服务器。一旦你的浏览器接收到了响应,它就解析代码并展示页面。
 
 
浏览器,也就是我们说的客户端 ,也可以不太严谨的说facebook的服务器就是个API ,这意味这每次你在网络上浏览网页的时候,你就和一些远程服务器的API发生了交互。
 
 
一个API并不是等同于一整个远程服务器,他是服务器用来接受请求和发送响应的一部分
 


API就是一种为你客户提供服务的方法

你可能听说过公司将API包做成一个产品,例如,”地下气象站“出售的就是它自己的气象数据API的 入口
 
 
实例场景: 你的个人小型商业网站有一个给客户注册的预约表格,你想要给你的客户提供自动创建一个谷歌日历时间的能力。
 
 
API 使用:这概念就是让你的网站服务器带着请求去创建一个具体的事件,你的服务器之后会接收到谷歌的响应,处理它,然后将有关信息发送回给你的浏览器,例如发送一个认证信息给你的用户
 
 
另外,你的浏览器会通过你的服务器经常直接发送API 请求到谷歌服务器
 
 
谷歌日历的API 和其他的远程服务器的API 究竟有什么不同
 
 
专业的说,不同之处在于他们的请求和响应的形式是不一样的
 
 
当你提交整个页面的时候,你的浏览器期待的是一种HTML格式的响应,这个响应里包含了一些描述性的代码,当谷歌日历API 响应的时候会返回一些数据,大多是类似与json的格式
 
 
如果你的网站服务器发出了个API 请求,那么你的网站服务器就变成了个客户端(类似与当你使用浏览器访问网站的时候你的浏览器就成了客户端一样)
 
 
从用户的角度来说,API允许他们完成一些没有离开网站的动作
 
 
很多现代的网站都至少使用了一些第三方API
 
 
很多问题都有了第三方的解决方案了,无论是以函数库或者是服务的形式,使用第三方的解决方案现在已经逐渐变得更简单和更可靠。
 
 
这是很常见的,开发团队将他们的应用分解到多个服务器里面,服务器通过API 相互交流。为主应用服务器提供辅助功能的服务器这方面的知识可以参考微型服务器
 
 
总得来说,当一个公司向它的用户提供了API 的时候,这就意味着他们建造了一系列的专用URL通道,用来返回纯数据形式的响应,意味这响应不会包含一些用于解释的额外开销,你期望的是一种像网站一样的图表用户界面。
 
 
你的浏览器可以发送这种请求吗,当然可以,由于实际的HTTP传输都是以文本的形式进行的,你的浏览器总是能达到它能展示响应的最好状态
 
 
例如,你可以通过浏览器直接访问GitHub的API ,甚至根本不需要访问标记(=_= # 什么是访问标记.....),当你用浏览器访问一个GitHub的用户API的时候,你将获得一个JSON形式的响应
 
[html] view plain copy
 
  1. {  
  2.   "login": "petrgazarov",  
  3.   "id": 5581195,  
  4.   "avatar_url": "https://avatars.githubusercontent.com/u/5581195?v=3",  
  5.   "gravatar_id": "",  
  6.   "url": "https://api.github.com/users/petrgazarov",  
  7.   "html_url": "https://github.com/petrgazarov",  
  8.   "followers_url": "https://api.github.com/users/petrgazarov/followers",  
  9.   "following_url": "https://api.github.com/users/petrgazarov/following{/other_user}",  
  10.   "gists_url": "https://api.github.com/users/petrgazarov/gists{/gist_id}",  
  11.   "starred_url": "https://api.github.com/users/petrgazarov/starred{/owner}{/repo}",  
  12.   "subscriptions_url": "https://api.github.com/users/petrgazarov/subscriptions",  
  13.   "organizations_url": "https://api.github.com/users/petrgazarov/orgs",  
  14.   "repos_url": "https://api.github.com/users/petrgazarov/repos",  
  15.   "events_url": "https://api.github.com/users/petrgazarov/events{/privacy}",  
  16.   "received_events_url": "https://api.github.com/users/petrgazarov/received_events",  
  17.   "type": "User",  
  18.   "site_admin": false,  
  19.   "name": "Petr Gazarov",  
  20.   "company": "PolicyGenius",  
  21.   "blog": "http://petrgazarov.com/",  
  22.   "location": "NYC",  
  23.   "email": "petrgazarov@gmail.com",  
  24.   "hireable": null,  
  25.   "bio": null,  
  26.   "public_repos": 23,  
  27.   "public_gists": 0,  
  28.   "followers": 7,  
  29.   "following": 14,  
  30.   "created_at": "2013-10-01T00:33:23Z",  
  31.   "updated_at": "2016-08-02T05:44:01Z"  
  32. }  
一个JSON的响应就像它已经是可以让你直接使用的代码了,很容易在这段文本里添加额外的数据,然后你就可以对这段数据做任何你想要做的事了
 
 

A就是application

作为结束,就多扔几个关于API 的事例吧
 
 
“应用”可以指很多事情,在API 里面他指代的是:
 
 1 :一个具有不同功能的软件
 2:整个服务器,整个app,或者是app的一小部分
 
基本上任何软件都可以从环境中有区别的分离开来,有可能在API 里成为A(也就是Application),也可能它本身就是某种API
 
 
假设你在你的代码里使用了第三方的函数库,一旦与你的代码结合了,一个函数路就成为了你真个APP里的一部分,成为软件中特殊的一部分,函数库很可能具有一个让你可以与你其他的代码相互沟通的API 
 
 
这有其他的一些例子,在面对对象设计中,代码是被组织进对象的,你的应用程序可能是由上百个可以相互交流的类构成的
 
 
每个类都有一个API ,一系列公共方法和用于和其他类进行交流的的属性
 
 
一个类可能有内部的私有化属性,这意味这它是对外部环境隐藏的(不是一个API )
 
 
-----------------------------

 

API就是一个简单的方法吧,就是用特定的方法获取特定类型的数据。在web应用中,我们可以简单理解为,通过HTTP协议+URL获取网络上某个资源的方法,响应一般是JSON格式。

 

-----------------------------
 

  什么是API?为什么要提供API?  

API是系统的基石,是Windows的一砖一瓦。


明确一个概念,软件是运行在系统平台的支持上的,软件的功能其实就是向系统伸请,并由系统完成这些功能的过程。


那么软件要做的事情如何传递给系统呢,也就是这些API的作用了,系统定义了这些API函数,做为支持软件执行系统功能的接口。


不同的操作系统自然API会是不同的.

 

 

  API(Application Programming Interface,应用程序编程接口)

是一套用来控制Windows的各个部件(从桌面的外观到为一个新进程分配的内存)的外观和行为的一套预先定义的Windows函数.

用户的每个动作都会引发一个或几个函数的运行以告诉Windows发生了什么.    

这在某种程度上很象Windows的天然代码.其他的语言只是提供一种能自动而且更容易的访问API的方法.VB在这方面作了很多工作.

它完全隐藏了API并且提供了在Windows环境下编程的一种完全不同的方法.     

这也就是说,你用VB写出的每行代码都会被VB转换为API函数传递给Windows.例如,Form1.Print...VB 

将会以一定的参数(你的代码中提供的,或是默认参数)调用TextOut 这个API函数.    

同样,当你点击窗体上的一个按钮时,Windows会发送一个消息给窗体(这对于你来说是隐藏的),VB获取这个调用并经过分析后生成一个特定事件(Button_Click).    

API函数包含在Windows系统目录下的动态连接库文件中(如User32.dll,GDI32.dll,Shell32.dll...).    API 声明     

正如在"什么是API"中所说,API函数包含在位于系统目录下的DLL文件中.

你可以自己输入API函数的声明,但VB提供了一种更简单的方法,即使用API Text Viewer.  

  要想在你的工程中声明API函数,只需运行API Text Viewer,打开Win32api.txt(或.MDB如果你已经把它转换成了数据库的话,这样可以加快速度.注:微软的这个文件有很多的不足,你可以试一下本站提供下载的api32.txt),

选择"声明",找到所需函数,点击"添加(Add)"并"复制(Copy)",然后粘贴(Paste)到你的工程里.使用预定义的常量和类型也是同样的方法.    

你将会遇到一些问题:     假设你想在你的窗体模块中声明一个函数.粘贴然后运行,VB会告诉你:编译错误...Declare 语句不允许作为类或对象模块中的 Public 成员...看起来很糟糕,其实你需要做的只是在声明前面添加一个Private(如 Private Declare Function...).--不要忘了,可是这将使该函数只在该窗体模块可用.   



在有些情况下,你会得到"不明确的名称"这样的提示,这是因为函数.常量或其他的什么东西共用了一个名称.由于绝大多数的函数(也可能是全部,我没有验证过)都进行了别名化,亦即意味着你可以通过Alias子句使用其它的而不是他们原有的名称,你只需简单地改变一下函数名称而它仍然可以正常运行.    

 

你可以通过查看VB的Declare语句帮助主题来获取有关Alias的详细说明.   

 消息(Messages)     

好了,现在你已经知道什么是API函数了,但你也一定听说过消息(如果你还没有,你很快就会)并且想知道它是什么.消息是Windows告诉你的程序发生了哪些事件或要求执行特定操作的基本方法.例如,当用户点击一个按钮,移动鼠标,或是向文本框中键入文字时,一条消息就会被发送给你的窗体.     

 

所有发送的消息都有四个参数--一个窗口句柄(hwnd),一个消息编号(msg)还有两个32位长度(Long)的参数.    

hwnd即要接受消息的一个窗口的句柄,msg即消息的标识符(编号).该标识符是指引发消息的动作类型(如移动鼠标),另外两个参数是该消息的附加参数(例如当鼠标移动时光标的当前位置)     

但是,当消息发送给你时你为什么看不到呢--就象有人在偷你的信一样?请先别恼火,让我告诉你.     

小偷其实是Visual Basic.但它并没有偷走你的信,而是在阅读了之后挑出重要的以一种好的方式告诉你.这种方式就是你代码中的事件(Event).    

这样,当用户在你的窗体上移动鼠标时,Windows会发送一条WM_MOUSEMOVE消息给你的窗口,VB得到这条消息以及它的参数并运行你在事件MouseMove中的代码,同时VB会把这条消息的第二个32位数(它包含了x,y坐标,单位为像素(Pixel),每个位16位)转换为两个单精度数,单位为缇(Twip).    

现在,如果你需要光标坐标的像素表示,然而VB已经把它转换成了缇,因此你需要重新把它转换为以像素为单位.在这里,Windows给了你所需要的,但VB"好意地"进行了转换而使你不得不重新转换.你可能会问--我难道不能自己接收消息吗?答案是肯定的,你可以使用一种叫做子类处理(Subclass)的方法.但你除非必须否则最好不要使用,因为这与VB的安全程序设计有一点点的违背.(注:子类处理确实有很大的风险,但如果使用得当,是很有用处的.不过有一点一定要注意,即千万不要使用VB的断点调试功能,这可能会导致VB崩溃!)    

 

需要补充说明的是:你可以发送消息给你自己的窗口或其他的窗口,只需调用 SendMessage或PostMessage(SendMessage会使接受到消息的窗口立刻处理消息,而PostMessage是把消息发送到一个称为消息队列的队列中去,等候处理(它将会在该消息处

理完后返回,例如有些延迟)).你必须制定接受消息的窗口的句柄,欲发送消息的编号(所有的消息的编号均为常量,你可以通过API Text Viewer查得)以及两个32位的参数。    

 

另一种含义:    

1:美国石油协会(API:American Petrolenm Institute):  API610/682是机械密封的设计和选用标准;  API676 转子泵的标准;     

2:API还有一种含意:空气污染指数。【英文 air pollution index 的缩写】    

 3:在JAVA中,API除了有应用“程序程序接口”的意思外,还特指JAVA API的说明文档,也称为JAVA帮助文档。    4.API Q1质量体系认证是您向用户证明您有一套API认可的完善的质量管理体系, 有些石油、天然气设备制造商所生产的产品目前没有所适用API会标产品的规范对应, 但他们又想向用户证明他们的产品或服务符合API标准的要求,所以API Q1质量体系认证可以帮您办到。API Q1质量体系认证特别适用于那些所生产的产品没有相应的API会标产品规范所对应的石油、天然气设备生产厂家, 或向石油、天然气行业提供服务的公司。    

 

另一种含义:    

使用API(应用编程接口,英文全称:Application Programming Interface)构建业务是实现开放式业务结构的关键技术,也是下一代网络区别于传统电信网的主要特点之一。目前,关于下一代网络的开放式业务API标准主要包括:由Parlay组织、3GPP和ETSI SPAN共同制定的Parlay/OSA API以及由SUN公司在Java平台上推出的JAIN API。

  Parlay API是由Parlay组织定义的便于业务开发者快速创建电信业务的应用编程接口,自1999年成立以来,Parlay组织已制定了4个版本的Parlay协议。开放式业务结构(OSA)是3GPP制定的多媒体业务框架,选定Parlay作为其开放式业务接口API。

两者结合的Parlay/OSA API独立于具体的实现技术,可以应用于固定网络、移动网络以及下一代网络的业务提供;独立于具体的实现语言,可以用C、C++、Java等各种语言实现;定义了完善的认证和授权机制,以支持对第3方应用的支持。   Parlay/OSA API位于由网络运营商管理的Parlay网关和由业务提供商管理的应用服务器之间。Parlay网关对应用服务器屏蔽了下层网络的技术实现细节,使得应用服务器可以使用统一的方式对网络能力进行访问。 

  Parlay/OSA API包括两类接口:业务接口和框架接口。业务接口提供应用访问网络能力和信息的接口,框架接口提供业务接口安全、管理所必需的支持能力。业务接口保证用户能够接入传统网络,如呼叫控制、呼叫管理、发送消息、用户交互等;框架接口提供的功能有:业务登记、业务预订、业务发现、认证、授权和综合管理。  

JAIN API

Parlay/OSA API设计思想相近,功能上具有互补性。它采用专一的Java语言实现,并且定义了比较完备的访问各种网络的网络协议API。目前Parlay/JAIN联合工作组正在进行两者的融合工作。

posted @ 2018-12-17 17:35  Stefanlyl  阅读(654)  评论(0编辑  收藏  举报