目录
1、什么叫API
阅读编程资料时经常会看到API这个名词,网上各种高大上的解释估计放倒了一批初学者。初学者看到下面这一段话可能就有点头痛了。
API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。——百度百科
这篇文章我们就来通俗易懂地解释下什么叫做 API,你只需要花费1分钟时间。
从文件操作开始谈API。
以C语言为例,我们使用fopen()函数可以打开一个文件,感觉非常简单。文件保存在硬盘上,要经过复杂的处理才能显示,这些细节对我们来说是透明的,由操作系统完成。也就是说,我们调用fopen()函数来通知操作系统,让操作系统打开一个文件。
那么,我们如何告诉操作系统打开文件呢?
看似简单的操作到底层都非常复杂,打开文件首先要扫描硬盘,找到文件的位置,然后从文件中读取一部分数据,将数据放进I/O缓冲区,放进内存;这些数据都是0、1序列,还要对照ASCII表或Unicode表”翻译“成字符,再在显示器上显示出来。这个过程如果要让程序员来完成,那简直是噩梦!
怎么办呢?操作系统想了一个很好的办法,它预先把这些复杂的操作写在一个函数里面,编译成一个组件(一般是动态链接库),随操作系统一起发布,并配上说明文档,程序员只需要简单地调用这些函数就可以完成复杂的工作,让编程变得简单有趣。这些封装好的函数,就叫做API(Application Programming Interface),即应用程序编程接口。
说得更加通俗易懂一些,别人写好的代码,或者编译好的程序,提供给你使用,就叫做API。你使用了别人代码(或者程序)中的某个函数、类、对象,就叫做使用了某个API。
操作系统 API
操作系统已经为我们实现了很多功能,它们都被封装成了一个一个的函数,有成百上千个之多,这些函数就叫做 API。程序员要想使用某个功能,只需要调用相应的函数。Windows、Linux、Mac OS、Unix 这些常见的操作系统大部分功能都使用C语言开发,它们的 API 也以C语言的形式呈现。操作系统 API 数目众多,官方必须提供详细的说明文档(Windows API 的说明文档叫 MSDN),程序员在使用 API 时,需要频繁地查阅这些文档。
Windows API控件与消息函数 ,如:
1.AdjustWindowRect 给定一种窗口样式,计算获得目标客户区矩形所需的窗口大小。
2.AnyPopup 判断屏幕上是否存在任何弹出式窗口。
3.ArrangeIconicWindows 排列一个父窗口的最小化子窗口。
编程语言 API:
各种编程语言自带的标准库其实也是API。这些API由编程语言的开发者们编写,安全、高效、健壮,为我们实现了常见的功能,让我们不用再重复造轮子。
C语言 API 以函数的形式呈现,例如 printf()、scanf()、fopen() 等。
Java API 主要以类的形式呈现,例如 String、Thread、Date 等。
C++ 是在C语言的基础上进行的扩展,所以 C++ API 既包含函数也包含类。
第三方库(框架)
libxml2——xml的c语言版库,2个项目使用过,win和Linux下都很犀利~~比较快捷
CURL—— 这个用的主要是使用了他的封装的http和https的请求,比较犀利,其中包含了openssl的内容
iconv——功能强大的编码格式转化库,UTF8,Unicode等互相转化很方便
openssl——C的开源密库,可以进行证书加密和https的访问的模拟提交可以和CURL配合使用
cocos2d——2D游戏引擎,相比较传统的UI自己控制的重画
OpenCV——开源图像库
还有很多第三方(非官方)的组织机构、公司、个人提供的代码,也是一种 API。这些代码有的免费,有的收费;有的开源,有的闭源。这些代码大都针对某个特定的应用领域编写,有时候被称为框架或者库。例如基于C语言的图形界面库GTK,基于C++的网络库ACE,基于Java的大数据处理平台Hadoop,基于Python的Web开发框架Django,基于JavaScript的前端开发框架React。
全球最大的代码托管网站GitHub也贡献了很多优秀的代码,它们大都开源免费。作为开源代码库以及版本控制系统,Github拥有超过900万开发者用户。随着越来越多的应用程序转移到了云上,Github已经成为了管理软件开发以及发现已有代码的首选方法。。这些第三方的API数目众多,种类丰富,我们应该大胆去使用,尽量避免重复造轮子。
常见问题:
假设你想在你的窗体模块中声明一个函数,粘贴然后运行,VB会告诉你:编译错误...Declare 语句不允许作为类或对象模块中的Public(公共的) 成员。..看起来很糟糕,其实你需要做的只是在声明前面添加一个Private(私有的)。不要忘了,可是这将使该函数只在该窗体模块可用。. 在有些情况下,你会得到"不明确的名称"这样的提示,这是因为函数、常量或其他的什么东西共用了一个名称。由于绝大多数的函数都进行了别名化,亦即意味着你可以通过Alias子句使用其它的而不是他们原有的名称,你只需简单地改变一下函数名称而它仍然可以正常运行。
总结:API随处可见,它屏蔽了很多底层细节,实现了很多常用功能,大大简化了程序员的工作。用好API,事半功倍!
2、阿里云天气预报API介绍
通过地名、地名对应ID、坐标区域、IP地址、景点名称ID、电话区号或邮编来查询天气情况。可查询到40天内的天气数据,可应用于能源、电力、农业、生活服务类应用、智能硬件、航天航海、旅游业、建筑业等领域。
3、调用API准备工作及认识
在调用API商品时,首先要确定认证方式,我们使用简单身份认证(AppCode)的认证方式。该方式适合场景:客户端环境(调用API商品的环境)安全可控,如内网环境。技术原理概述:客户端程序将AppCode放到Request Header中,或者放到Request的Query参数中,从而进行身份认证。优点:简单易用,无需复杂的生成签名的过程,各种开发语言都能很简单的使用,API商品也提供了多语言的调用示例。缺点:认证方式本身的安全性较低,AppCode在网络的传输过程是以明文的方式在Http Request中,因此存在泄露风险。
(使用建议:建议调用API时采用Https方式,尽量减少传输过程中泄露风险)
4、创建属于自己的API
1. 百度搜索阿里云免费天气预报API,进入阿里云云市场。
2、 在“API市场”中选取“易源数据-全国天气预报查询”产品服务并免费申请购买资源。
2、购买成功后,登录“云市场”控制台,在已购买的服务中可以查看到所有购买成功的API商品信息,下图红框中的就是AppKey、AppSecret、AppCode信息。
3、就可以进行调试
5、调试结果
5、代码实现
package com.imooc.weather;
import com.imooc.weather.DayWeather;
import com.imooc.weather.HourWeather;
import com.imooc.weather.WeatherUtils;
import com.imooc.weather.impl.WeatherUtilsImpl;
import java.util.List;
import java.util.Scanner;
public class Application {
public static void main(String[] args) {
System.out.println("查询最近天气预报:");
System.out.println("输入1:查询未来24小时天气预报:");
System.out.println("输入2:查询未来3天天气预报");
System.out.println("输入3:查询未来7天天气预报");
System.out.print("请输入您的选择:");
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();
System.out.println("用户输入数字:" + i);
if (i==1){
System.out.print("请输入城市名称查询未来24小时天气预报:");
String city = scanner.next();
WeatherUtils weatherUtils = new WeatherUtilsImpl();
List<HourWeather> weatherList = weatherUtils.w24h("1ecbd92294534beda37c36a92b0b2b6c",city);//API输入自己的api应用程序编程接口,这里就不提供了!
System.out.println(weatherList);
if (weatherList.size() == 0){
System.out.println("抱歉,未收录您查询的城市天气数据。");
}else{
for (HourWeather hourWeather : weatherList){
String template = "%s月%s日%s时|%-3s|%-20s|%-8s|%-4s℃";
String row = String.format(template,new String[]{
hourWeather.getMonth(),
hourWeather.getDay(),
hourWeather.getHour(),
hourWeather.getWindDirection(),
hourWeather.getWindPower(),
hourWeather.getWeather(),
hourWeather.getTemperature()
});
System.out.println(row);
}
}
} else if (i==2){
System.out.print("请输入城市名称查询未来3天天气预报:");
String city = scanner.next();
WeatherUtils weatherUtils = new WeatherUtilsImpl();
List<DayWeather> weatherList = weatherUtils.w3d("1ecbd92294534beda37c36a92b0b2b6c", city);//API输入自己的api应用程序编程接口
System.out.println(weatherList.size());
if (weatherList.size() == 0) {
System.out.println("抱歉,未收录您查询的城市天气数据。");
}else{
for (DayWeather weather : weatherList){
String template = "%-2s月%-2s日 | 气温: %s℃(日) %s℃(夜) | 天气: %s(日) %s(夜) | 风力: %s(日) %s(夜)";
String row = String.format(template,new String[]{
weather.getMonth(),
weather.getDay(),
weather.getDayAirTemperature(),
weather.getNightAirTemperature(),
weather.getDayWeather(),
weather.getNightWeather(),
weather.getDayWindPower(),
weather.getNightWindPower()
});
System.out.println(row);
}
}
}
else if (i==3) {
System.out.print("请输入城市名称查询未来7天天气预报:");
String city = scanner.next();
WeatherUtils weatherUtils = new WeatherUtilsImpl();
List<DayWeather> weatherList = weatherUtils.w7d("1ecbd92294534beda37c36a92b0b2b6c", city);//API输入自己的api应用程序编程接口
System.out.println(weatherList.size());
if (weatherList.size() == 0) {
System.out.println("抱歉,未收录您查询的城市天气数据。");
} else {
for (DayWeather weather : weatherList) {
String template = "%-2s月%-2s日 | 气温: %s℃(日) %s℃(夜) | 天气: %s(日) %s(夜) | 风力: %s(日) %s(夜)";
String row = String.format(template, new String[]{
weather.getMonth(),
weather.getDay(),
weather.getDayAirTemperature(),
weather.getNightAirTemperature(),
weather.getDayWeather(),
weather.getNightWeather(),
weather.getDayWindPower(),
weather.getNightWindPower()
});
System.out.println(row);
}
}
}
}
}
6、结果展示
24小时天气预报
3天天气预报
7天天气预报