API(接口)是什么?举个常见的例子,在京东上下单付款之后,商家选用顺丰发货,然后你就可以在京东上实时查看当前的物流信息。京东和顺丰作为两家独立的公司,为什么会在京东上实时看到顺丰的快递信息,这就要用到API,当查看自己的快递信息时,京东利用顺丰提供的API接口,可以实时调取信息呈现在自己的网站上。除此,你也可以在快递100上输入订单号查取到快递信息。只要有合作,或是有允许,别的公司都可以通过顺丰提供的API接口调取到快递信息。既然有多方调用,那提供一个统一的调用规范会方便很多。

我们看下百度是怎么给出API的定义的:

API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

从百度定义中,我们先划下重点:函数、 提供应用程序与开发人员 、无需访问源码、例程 。注意这四个短语。其中,例程是某个系统对外提供的功能接口或服务的集合,本文着重说下API的数据服务功能接口

首先,下面的文章我会先演示怎么通过浏览器,不需要编程、不需要访问源码,来调用免费的API接口,达到让你怎么使用最简单的接口;

然后,会演示怎么通过编程去调用接口;

最后,演示开启WEB服务,写一个简单的API接口,以体现出API的函数 (y=f(x)) 功能。

你也可以复制代码试下。通过你自己的尝试,你会了解到些后端、前段的东西,并加深你对API的理解。那么我们就开始吧,先上一个图:以API提供信息(数据)的功能,看下数据是怎么流动的。如果给API一个具体的位置的话,就位于下图中央。

为了更改的理解,我穿插一个故事角色。假如,世界太大,身处非洲大陆的你想去看看,成为了一个水手,被一位著名的航海家带去去远航(你掌握着船上唯一一台卫星电脑),途中不免航海家会让确定下城市的经纬度。这时航海家让你去确定下深圳市的经纬度。

1、你是个人肉API

这时,你能想到简单的办法就是去百度搜索一下。 除了航海家,船上的高级水手、大副,估计都有可能向你问,这个时候,其实你就是一个接口,大家都来向你获取地理位置信息,作为接口,你本身不产生信息,你只是信息的搜集者、传递者,提供人肉数据服务。

2、使用免费的经纬度API接口

在百度搜索的过程中,众多网友给出的经纬度不一致,你要反复对比,去辨真伪。时间长了,你可能会觉得大家都问位置,太烦了,我这个人肉API效率太慢,有没有更快的方式。

这时你发现了一个阿里云的一个免费的API接口:http://gc.ditu.aliyun.com/geocoding?a=深圳。你在浏览器地址栏输入了这个URL,果然得到了正确的经纬度,你又把URL中的深圳改为了别的城市,发现也可以查到。这时,通个这个接口,你给大伙确定位置的效率大大提升。

3、你不满足于此

你觉得这个接口太好了,刚好你会点Python,何不写点代码,注意这个时候你的角色发生了变化:你由一个人肉API转变了一个开发人员(注意这个是百度API定义中的关键词),你现在的目标是写代码,能够自动获取到这个某个地方的经纬度。

#python
import requests
r = requests.get("http://gc.ditu.aliyun.com/geocoding?a=深圳")
loc = r.json()
print loc
#打印出的结果:{u'alevel': 4, u'lon': 114.05786, u'level': 2, u'cityName': u'', u'address': u'', u'lat': 22.54309}
# 与在浏览器输入地址的结果一致print "深圳的经度是%s,纬度是%s" % (loc["lon"], loc["lat"])
#打印出的结果是:深圳的经度是114.05786,纬度是22.54309

到这里,我们再来回顾下API的百度定义。目前,你作为一个开发人员, 具备通过写了几行代码访问“阿里云经纬度接口”的能力, 你无需访问这个API的源码、不需要理解这个API是怎么弄成的 。也就是,不管是通过浏览器,还是编程语言,目前你已经会用简单的API了。

4、在会用简单API的接口后,你进一步想知道它的内在机制是什么

建立在会用的基础之上,那么API的源码、其内在机制是怎么回事?目前你能调用经纬度的API,简单的获取到位置还不够,你可能自己想写一个API接口,不紧紧提供位置信息,同时附加上对这个城市的介绍。

利用Python的tornado模块,搭建一个web服务。我们建一个脚本空文件 web_server.py,把以下代码复制进去

# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')import tornado.ioloop
import tornado.web
import json
import requestslists = {u"深圳": "是经济特区,紧邻广州,接壤香港,人口约1200万",u"青岛": "旅游城市,濒临黄海,特产啤酒,人口约920万"}def get_loc(city):r = requests.get("http://gc.ditu.aliyun.com/geocoding?a=%s" % city.encode('UTF-8'))loc = r.json()return "经度是%s,纬度是%s" % (loc["lon"], loc["lat"])class BaseHandler(tornado.web.RequestHandler):def get_current_user(self):return self.get_secure_cookie("user")class MainHandler(BaseHandler):def get(self):if self.request.arguments.has_key("id"):greeting = self.get_argument('id', 'Hello')if greeting in lists:self.write(greeting + ": " + str(get_loc(greeting)) + "," + str(lists[greeting]))else:self.write("none")settings = dict(cookie_secret="P1/V61oETzdkLmGeJJFuYh7Eo5KXQAGaYgEQnp2XdTo=", debug=True)
application = tornado.web.Application([(r"/", MainHandler), ], **settings)if __name__ == "__main__":application.listen(8888)tornado.ioloop.IOLoop.current().start()

执行web_server.py,执行后就会开启一个web服务

接着,我们在浏览器输入http://192.168.199.204:8888/?id=深圳

注意,我自己的电脑局域网IP是192.168.199.204,需要替换成你自己电脑(或虚拟机)的ip

从上图看,我们实现了,和”阿里云经纬接口“的相同功能,并且获取到了除经纬度,还有对城市的简单描述。随着航行越来越多,你让船上的大伙不仅了解了地理位置信息,也了解了每个城市的经济人文情况。随着信息数据的增多,特别需要一个东西能先把数据先保存起来,用到的时候,API再直接调用。

5、数据储存,调我所需

上面我们模仿了阿里云的API,自己搭建了一个web服务,提供额一个更为详细的API地理位置信息服务。现在想一下,我们的代码里只有深圳、青岛两个城市,还有很多没提到的城市,另外,城市还有经济发展情况、饮食文化等。我们把深圳、青岛两个城市信息存入到mysql里。

存入之后,我们从mysql里直接拿数据,通过API直接展现在到浏览器中。改动 web_server.py脚本中的

# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')import tornado.ioloop
import tornado.web
import json
import requests
import MySQLdb.constantsdef get_mysql(sql_string):conn = MySQLdb.connect(host='localhost', port = 3306, user = 'root', passwd = '123456', db = 'test', charset = 'utf8')cursor = conn.cursor()cursor.execute(sql_string)resultList = {}for data in cursor.fetchall():city_name = data[0]city_introduce = data[1]resultList[city_name] = city_introducereturn resultListcursor.close()conn1.close()def get_loc(city):r = requests.get("http://gc.ditu.aliyun.com/geocoding?a=%s" % city.encode('UTF-8'))loc = r.json()return "经度是%s,纬度是%s" % (loc["lon"], loc["lat"])class BaseHandler(tornado.web.RequestHandler):def get_current_user(self):return self.get_secure_cookie("user")class MainHandler(BaseHandler):def get(self):if self.request.arguments.has_key("id"):greeting = self.get_argument('id', 'Hello')lists = get_mysql("select name,introduce  from test.city where name ='%s' " % greeting.encode('UTF-8'))  #直接从mysql里读取城市信息,特别注意这里的SQLif greeting in lists:self.write(greeting + ": " + str(get_loc(greeting)) + "," + str(lists[greeting]))else:self.write("none")settings = dict(cookie_secret="P1/V61oETzdkLmGeJJFuYh7Eo5KXQAGaYgEQnp2XdTo=", debug=True)
application = tornado.web.Application([(r"/", MainHandler), ], **settings)if __name__ == "__main__":application.listen(8888)tornado.ioloop.IOLoop.current().start()

保存web_server.py后,再执行重启下,浏览器地址输入http://192.168.199.204:8888/?id=深圳,出现与第4步同样的结果,但这次是从mysql中拿数据,通过API接口展示到浏览器的。至此,你不仅会使用API,而且也通过tornado开启web服务、开启了一个API查询接口。

最后再总结一下,从上面的文中,首先我大概画了一张图,结合数据的流动,描述了API的位置,接着用了一个故事从一个信息的搜集者,怎么利用现有的接口,去提供一个更棒的接口。当然这个太简单了。但我觉得也能说明API的基本意思,生产环境中API要复杂的多牵涉到数据的复杂性、接口的稳定性、高可用、还有安全性。

(本文完,有问题,请留言)

推荐链接:

1、知乎上对API的回答

https://www.zhihu.com/question/38594466/answer/228418422

https://www.zhihu.com/question/38594466/answer/215257117

API的作用:

-对于软件提供商来说,留出API,让别的应用程序来调用,形成生态,软件才能发挥最大的价值,才能更有生命力。(同时别人也看不见代码,不伤害商业机密。) (可以用顺丰京东举例)

-对于应用开发者来说,有了开放的API,就可以直接调用多家公司做好的功能来做自己的应用,不需要所有的事情都自己操刀,节省精力。

https://www.zhihu.com/question/21691705/answer/26406216

API (Application Programming Interface)

翻译成中文就是"应用程式介面",其实这样翻译不好,应该说是"程式沟通介面"。

翻译为介面,顾名思义就要沟通两个不同的东西用的,通常由一组函式库所组成。

在一个 同一个平台 下的 两个不同东西(程式 or 系统),为了能取用对方的功能等等,

所以一个 X程式 写了一组函式,让 同一平台的其他程式 取用 X程式 的功能,

那组函式就可以说是那个 X程式 对外开放的 API。

2、HTTP基本原理

如果对大数据工作、技术工作感兴趣,也可以微信扫一扫我的公众号:

中如何调取api_API(接口)是什么相关推荐

  1. 理解java中的两种接口

    在java 中我们常常提高接口一词.在java 中有两中接口. 第一种接口:就是指系统对外提供的所有服务,在对象中表现为public类型的方法的声明.也就是我们常常在一个类中写的public的方法了. ...

  2. 【Groovy】Groovy 方法调用 ( Java 中函数参数是接口类型 | 函数参数是接口类型 可以 直接传递闭包 )

    文章目录 一.Java 中函数参数是接口类型 二.函数参数是接口类型 可以 直接传递闭包 三.完整代码示例 一.Java 中函数参数是接口类型 在 Android 中经常使用如下形式的接口 : 定义一 ...

  3. java配置接口提供给vue,vue在js中配置全局API接口

    在src文件夹中新建util文件夹,然后在新建一个globalAPI.js文件. 在js中配置后端的接口数据 const http = 'http://127.0.0.1:8989' const gl ...

  4. 03-JDBC学习手册:JDBC中几个重要接口和异常处理

    一.JDBC中几个重要接口 1  Statement --- SQL  语句执行接口 Statement 接口代表了一个数据库的状态,在向数据库发送相应的 SQL 语句 时,都需要创建 Stateme ...

  5. 深入理解Java中的抽象类和接口

    对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用, ...

  6. java 中的2个接口 Comparable和Comparator

    像Integer.String这些类型的数据都是已经实现Comparable接口的,所以对这些类型可以直接通过Arrays.sort(...)和Collections.sort(...)方法进行排序. ...

  7. Java中Comparable和Comparator接口区别分析

    本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧. Comparable 简介 Comp ...

  8. java comparator相等_详解Java中Comparable和Comparator接口的区别

    详解Java中Comparable和Comparator接口的区别 发布于 2020-7-20| 复制链接 摘记: 详解Java中Comparable和Comparator接口的区别本文要来详细分析一 ...

  9. JAVA中的通用文件下载接口

    本文记录下JAVA中的通用文件下载接口,每次都上网找,挺麻烦的. 文章目录 概述 概述 /*** 通用下载请求** @param filePathName 文件路径*/@GetMapping(&quo ...

最新文章

  1. Miller方法产生、检验素数
  2. 同一个内容,对比Java、C、PHP、Python的代码量,结局意外了
  3. SAP云平台架构概述
  4. ubuntu之Unable to lock the administration directory(/var/lib/dpkg/), are you root?13 Permission denie
  5. 【转】Burp Suite详细使用教程-Intruder模块详解
  6. 启科量子加速商业化:量子通信为「盾」,量子计算为「矛」
  7. python snownlp了解_python中snownlp情感分析简易的demo分享
  8. js登录界面使用ajax连接数据库,js用ajax连接数据库数据
  9. winxp无法访问服务器共享文件夹,winxp系统无法访问共享文件夹提示网络错误的技巧介绍...
  10. esxi 创建虚拟交换机_对vSphere虚拟交换机的理解
  11. 什么是3322域名?3322域名如何注册?
  12. 读《京东咚咚架构演进》有感
  13. 第17节 三层交换机技术—工作原理及相关命令
  14. PS如何快速完整的抠头发丝,请看详细的教程
  15. jupyterlab使用配置
  16. 判断手机是否被黑客入侵的7种方法
  17. Java高级——OutOfMemoryError和StackOverflowError
  18. 本地登录切断远程连接的简单方法
  19. 浅谈雷达在气象领域的基本应用
  20. Fragment中使用listview

热门文章

  1. Facebook、谷歌、微软和亚马逊的网络架构揭秘
  2. MySQL之父直播公开课来了!与腾讯云CDB专家天团联袂分享
  3. 技术分享:什么是CDN鉴权(by光网烈火)
  4. c++ 虚继承与继承的差异
  5. Serverless,后端小程序的未来
  6. Vue002_计算属性和监视
  7. 【PAT甲级 Date时间比较】1006 Sign In and Sign Out (20 分) Java版 5/5通过
  8. java 8 Streams简介
  9. 理解分布式一致性:Paxos协议之Cheap Paxos Fast Paxos
  10. mysql无效的时间默认值_mysql – ‘timestamp’的默认值无效