API入门教程(python实现)

什么是 API

  API,全称为 Application Programming Interface,即应用程序编程接口,是一个可用于检索代码并将数据发送到使用代码的服务器。

  当我们想从API接收数据时,我们需要发出请求。请求遍及整个网络。例如,当您访问此博客文章时,您的Web浏览器向服务器发出了请求,该服务器以该Web页的内容作为响应。

用python发送API请求

  先安装好python中的requests库 (Teriminal中直接输入)

pip install requests

第一个简单的API请求

  requests库中有许多不同类型的请求。最常用的一个GET请求用于检索数据。由于我们将仅检索数据,因此我们的重点将放在发出“get”请求上。

  发出“GET”请求,我们使用 requests.get( ) 函数,定义如下:

help(requests.get)
Help on function get in module requests.api:

get(url, params=None, **kwargs)
    Sends a GET request.
    
    :param url: URL for the new :class:`Request` object.
    :param params: (optional) Dictionary, list of tuples or bytes to send
        in the query string for the :class:`Request`.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    :return: :class:`Response <Response>` object
    :rtype: requests.Response

其中首先注意 u r l url url 这个输入参数,就是最重要的API接口。

  现在我们接入一个API

response = requests.get("http://api.open-notify.org/this-api-doesnt-exist")
print(response.status_code)

# 404

可能你们会很熟悉“404”这个状态代码,这是服务器返回的一个状态代码,说明要获取的资源并不存在与这个服务器上。

还有很多其他的状态代码:

·200:一切正常,结果已返回(如果有)。
·301:服务器将您重定向到其他端点。当公司切换域名或更改端点名称时,可能会发生这种情况。
·400:服务器认为您提出了错误的请求。当您没有正确发送数据时,可能会发生这种情况。
·401:服务器认为您未通过身份验证。许多API都需要登录证书,因此当您没有发送正确的凭据来访问API时就会发生这种情况。
·403:您尝试访问的资源被禁止:您没有查看该资源的正确权限。
·404:在服务器上找不到您尝试访问的资源。
·503:服务器尚未准备好处理请求。

GET 到真正的资源

  通常,特定服务器上会提供多个API。这些API中的每一个通常称为端点。我们将使用的第一个端点是http://api.open-notify.org/astros.json,该端点返回有关当前太空中宇航员的数据。

response = requests.get("http://api.open-notify.org/astros.json")
print(response.status_code)

# 200

返回值是“200”,说明一切正常,结果已返回。

但是要注意的是,返回的格式是JSON形式,我们来输出一下看看:

print(response.json())

#{'message': 'success', 'people': [{'name': 'Alexey Ovchinin', 'craft': 'ISS'}, {'name': 'Nick Hague', 'craft': 'ISS'}, {'name': 'Christina Koch', 'craft': 'ISS'}, {'name': 'Alexander Skvortsov', 'craft': 'ISS'}, {'name': 'Luca Parmitano', 'craft': 'ISS'}, {'name': 'Andrew Morgan', 'craft': 'ISS'}], 'number': 6}

输出的格式有利于计算器去阅读,但是我们并不容易去观察到这组数据的特点,这样,我们就需要导入json模块去处理这个JSON数据。

import json

def jprint(obj):
    # create a formatted string of the Python JSON object
    text = json.dumps(obj, sort_keys=True, indent=4)
    print(text)

jprint(response.json())

输出如下:

{
    
    
    "message": "success",
    "number": 6,
    "people": [
        {
    
    
            "craft": "ISS",
            "name": "Alexey Ovchinin"
        },
        {
    
    
            "craft": "ISS",
            "name": "Nick Hague"
        },
        {
    
    
            "craft": "ISS",
            "name": "Christina Koch"
        },
        {
    
    
            "craft": "ISS",
            "name": "Alexander Skvortsov"
        },
        {
    
    
            "craft": "ISS",
            "name": "Luca Parmitano"
        },
        {
    
    
            "craft": "ISS",
            "name": "Andrew Morgan"
        }
    ]
}

这样看起来,就是python中dictionary的形式,很容易去看到数据具有怎样的属性,也便于进一步的数据处理。

第二个重要参数——params

  在之前的GET函数中,除了输入URL,还有一个属性是params。不是所有请求的状况下都需要params,但请求某些特定的数据是,需要给服务器一个参量,才可以返回你想要的数据。

  例如http://api.open-notify.org/iss-pass.json这个端点。该端点下次告诉我们国际空间站将经过地球上的给定位置。这时候我们就要输入地理位置,已获取空间站的位置。

parameters = {
    
    
    "lat": 40.71,
    "lon": -74
}

以字典的形式给出一个经纬度信息,再次使用GET请求数据。

response = requests.get("http://api.open-notify.org/iss-pass.json", params=parameters)
jprint(response.json())

返回的数据:

{
    
    
    "message": "success",
    "request": {
    
    
        "altitude": 100,
        "datetime": 1568062811,
        "latitude": 40.71,
        "longitude": -74.0,
        "passes": 5
    },
    "response": [
        {
    
    
            "duration": 395,
            "risetime": 1568082479
        },
        {
    
    
            "duration": 640,
            "risetime": 1568088118
        },
        {
    
    
            "duration": 614,
            "risetime": 1568093944
        },
        {
    
    
            "duration": 555,
            "risetime": 1568099831
        },
        {
    
    
            "duration": 595,
            "risetime": 1568105674
        }
    ]
}

但是上述的时间——risetime 是一串数字,貌似很难去理解,这种时间格式叫做timestamp或者是epoch。我们可以使用datetime库来转化为我们熟悉的时间格式。

首先取出时间:

risetimes = []

for d in pass_times:
    time = d['risetime']
    risetimes.append(time)

print(risetimes)

然后导入datetime库,进行转换:

from datetime import datetime

times = []

for rt in risetimes:
    time = datetime.fromtimestamp(rt)
    times.append(time)
    print(time)

结果一目了然:

2019-09-09 21:27:59
2019-09-09 23:01:58
2019-09-10 00:39:04
2019-09-10 02:17:11
2019-09-10 03:54:34

结语

  这篇文章只是一个简单的教程,后面我会发布新的一篇使用python接入图灵机器人API的实战文章,敬请关注。

− − − − − − − − − − − − − − − − ----------------
该文章首发于 zyairelu.cn
欢迎来到我的网站进行评论及研讨
个人邮箱[email protected]
− − − − − − − − − − − − − − − − ----------------

猜你喜欢

转载自blog.csdn.net/weixin_42731543/article/details/103040753