如何在 Python 3 中使用网络 API

介绍

一个API,或 Aapplication Program Iinterface,允许开发人员将一个应用程序与另一个应用程序集成。

您可以使用API从其他程序中获取信息或自动化您通常在 Web 浏览器中所做的事情。有时,您可以使用API来做您无法以其他方式做的事情。

如果你已经通过一些教程(如何在Python中编码3)(https://www.digitalocean.com/community/tutorial_series/how-to-code-in-python-3)工作过,并且你对Python的语法,结构和一些内置的功能(https://andsky.com/tech/tutorials/how-to-define-functions-in-python-3)很满意,那么你可以编写利用你最喜欢的API的Python程序。

在本指南中,您将学习如何使用Python与DigitalOcean API(https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjttPKwlJbVAhVILyYKHSdOCDIQFggmMAA&url=https%3A%2F%2Fdevelopers.digitalocean.com%2F&usg=AFQjCNH6P3GhnE-YCtIHW0RfVz6-WOX--g)一起获取有关您的DigitalOcean帐户的信息,然后我们将看看您如何将所学到的应用于GitHub API(https://developer.github.com/v3/)。

当您完成时,您将了解Web APIs中常见的概念,您将有一步一步的流程和工作代码样本,您可以使用它们来尝试来自其他服务的API。

前提条件

在您开始本指南之前,您将需要以下内容:

您可以遵循 How To Install and Set Up a Local Programming Environment for Python 3 来配置您所需的一切。

  • 您使用的文本编辑器很舒适. 如果您还没有一个最喜欢的,请选择一个具有语法突出。 Notepad++用于Windows, BBEdit用于macOS,以及 Sublime TextAtom用于任何平台都是很好的选择。
  • 一个DigitalOcean帐户和API密钥。 How To Use the DigitalOcean API v2中的第一段落显示如何做到这一点。

步骤 1 – 熟悉 API

使用新的API的第一步是找到文档,并获得你的轴承. 数字海洋API的文档始于https://developers.digitalocean.com/. 寻找其他服务的API,搜索网站的名称和API - 并非所有服务在其首页上推广它们。

某些服务有 _API 包装器. API 包装器是您在系统上安装的代码,以便在您选择的编程语言中更容易使用 API。本指南不使用任何包装器,因为它们隐藏了 API 的大部分内部操作,并且通常不会暴露 API 所能做的一切。

首先,看看DigitalOcean API Introduction 在 https://developers.digitalocean.com/documentation/v2/,并尝试了解如何发送请求的基本知识,以及在响应中期望什么。

  1. 请求看起来是什么样子? 这些都只是URL吗? 对于更详细的请求,数据是如何格式化的? 它通常是 JSON 或查询参数,如网页浏览器使用,但有些使用XML或自定义格式。 2 响应看起来是什么样子? API 文档将显示样本请求和响应。 您是否会得到JSON、XML或其他类型的响应? 3 请求或响应标题是什么? 通常,请求标题包括您的身份验证标记,响应标题提供有关您使用服务的当前信息,例如您有多接近率限制。

DigitalOcean API 使用 HTTP methods (有时称为 verbs) 来表示您是否正在尝试阅读现有信息、创建新信息或删除某些东西。

API 文档的下一部分讨论了服务器将如何响应您的请求. 一般来说,请求要么成功,要么失败. 当它失败时,原因是请求的错误,要么在服务器上出现问题. 所有这些信息都通过使用 HTTP 状态代码进行通信,这是分为类别的三位数。

*「200」系列意味着「成功」 - 您的请求是有效的,而答案是由此得出的逻辑结果。 *「400」系列意味着「坏请求」 - 请求有某种错误,所以服务器无法像您想要的那样处理它。HTTP「400」级错误的常见原因是格式化不良的请求和身份验证问题。 *「500」系列意味着「服务器错误」 - 您的请求可能是好的,但服务器现在无法为您提供良好的响应,因为您无法控制这些原因。

你的代码应该总是检查HTTP状态代码的任何响应,然后尝试做任何事情,如果你不这样做,你会发现自己浪费时间来解决不完整的信息。

现在你已经知道如何发送请求,以及在响应中要寻找什么,是时候发送第一个请求了。

步骤 2 – 从 Web API 获取信息

您的 DigitalOcean 帐户包含一些您在 Web UI 中可能没有看到的管理信息. 一个 API 可以为您提供熟悉信息的不同视图. 仅仅看到这个替代视图有时会引发您想用 API 做些什么的想法,或者揭示您不知道的服务和选项。

让我们开始为我们的脚本创建一个项目,为该项目创建一个名为apis的新目录:

1mkdir apis

然后导航到这个新目录:

1cd apis

为此项目创建一个新的 virtualenv:

1python3 -m venv apis

激活虚拟化:

1source apis/bin/activate

然后安装 requests库,我们将在我们的脚本中使用它来在我们的脚本中执行 HTTP 请求:

1pip install requests

配置环境后,创建一个名为do_get_account.py的新Python文件,并在文本编辑器中打开它。

1[label do_get_account.py]
2import json
3import requests

这些导入声明加载了 Python 代码,允许我们使用 JSON 数据格式和 HTTP 协议。我们正在使用这些库,因为我们不感兴趣如何发送 HTTP 请求或如何分析和创建有效的 JSON;我们只是想使用它们来完成这些任务。

接下来,我们要设置一些 变量以保持每个请求中相同的信息,这将使我们不再需要反复输入它,并为我们提供一个单一的位置,以便在任何情况下进行更新。

1[label do_get_account.py]
2...
3api_token = 'your_api_token'
4api_url_base = 'https://api.digitalocean.com/v2/'

api_token变量是持有您的DigitalOcean API代币的字符串。 用自己的代币代替示例中的值。 api_url_base变量是DigitalOcean API中的每个URL开始的字符串。 我们将在代码中稍后按需要添加到它。

接下来,我们需要按照 API 文档描述的方式设置 HTTP 请求标题。 将这些行添加到文件中,以设置包含请求标题的 字典:

1[label do_get_account.py]
2...
3headers = {'Content-Type': 'application/json',
4           'Authorization': 'Bearer {0}'.format(api_token)}

内容类型标题告诉服务器在请求的体内预期JSON格式化数据。授权标题需要包含我们的代币,所以我们使用Python的字符串格式逻辑将我们的api_token变量插入字符串中,当我们创建字符串时。

  • 如果你需要更换代码,当它是一个单独的变量时,更容易看到该做什么的地方。
  • 如果你想与某人分享你的代码,更容易删除你的API代码,你的朋友更容易看到他们在哪里放置。

现在我们已经涵盖了这些设置细节,现在是时候发送请求了,你的倾向可能只是开始创建和发送请求,但有一个更好的方法。如果你把这个逻辑纳入处理发送请求和阅读响应的功能中,你将不得不更清楚地思考你正在做什么。

此函数将使用您创建的变量发送请求并返回Python字典中的帐户信息。

为了在这个早期阶段保持逻辑清晰,我们还不会做任何详细的错误处理,但我们很快就会补充到这一点。

定义收集帐户信息的函数. 根据其所作所为命名一个函数总是是一个好主意:这个函数收集帐户信息,所以我们将其称为get_account_info:

 1[label do_get_account.py]
 2...
 3def get_account_info():
 4
 5    api_url = '{0}account'.format(api_url_base)
 6
 7    response = requests.get(api_url, headers=headers)
 8
 9    if response.status_code == 200:
10        return json.loads(response.content.decode('utf-8'))
11    else:
12        return None

我们使用Python的字符串格式方法来构建api_url的值,类似于我们在标题中使用的字符串格式;我们在字符串帐户前添加API的基 URL,以获取URLhttps://api.digitalocean.com/v2/account,该 URL应该返回帐户信息。

响应变量持有由Python请求 模块创建的对象,该行将请求发送到我们用脚本开始时定义的标题的URL,并返回API的响应。

接下来,我们看看响应的 HTTP 状态代码。

如果它是200,一个成功的响应,那么我们使用json模块的加载函数来加载一个字符串作为JSON。我们加载的字符串是response.content对象的内容。

如果答案是 not 200,那么我们返回‘None’,这是Python中的一个特殊值,当我们调用这个函数时我们可以检查它。

现在拨打此函数,检查以确保它获得了良好的响应,并打印 API 返回的详细信息:

 1[label do_get_account.py]
 2...
 3account_info = get_account_info()
 4
 5if account_info is not None:
 6    print("Here's your info: ")
 7    for k, v in account_info['account'].items():
 8        print('{0}:{1}'.format(k, v))
 9
10else:
11    print('[!] Request Failed')

account_info = get_account_info()account_info 变量设置为从呼叫中返回到 get_account_info() 的任何内容,因此它将是特殊值 `None' 或将收集有关帐户的信息。

如果它不是None,那么我们会用所有Python字典的items()方法将每个信息打印到自己的行上。

否则(即如果account_infoNone),我们会打印错误消息。

让我们在这里暂停一分钟。这个如果声明中含有双消极的声明可能起初感觉不舒服,但它是一种常见的Python语法。它的美德在于保持成功运行的代码非常接近(条件)(https://andsky.com/tech/tutorials/how-to-write-conditional-statements-in-python-3-2)而不是处理错误案例后。

如果您喜欢,您可以以相反的方式进行操作,并且实际上可以自己编写这个代码,而不是如果 account_info 不是 None:,您可以从如果 account_info 是 None:开始,然后看看其余的内容是如何完成的。

保存脚本并尝试一下:

1python do_get_account.py

输出将看起来像这样:

1[secondary_label Output]
2Here's your info: 
3droplet_limit:25
4email:[email protected]
5status:active
6floating_ip_limit:3
7email_verified:True
8uuid:123e4567e89b12d3a456426655440000
9status_message:

现在你知道如何从API中获取数据,接下来,我们将转向一些更有趣的事情 - 使用API来更改数据。

步骤 3 – 更改服务器上的信息

练习只读请求后,是时候开始做出更改了,让我们通过使用Python和DigitalOcean API来探索这一点,将SSH密钥添加到您的DigitalOcean帐户中。

首先,看看 SSH 密钥的 API 文档,可在 https://developers.digitalocean.com/documentation/v2/#ssh-keys 找到。

该 API 允许您在帐户中列出当前的 SSH 密钥,并允许您添加新的密钥。 获取 SSH 密钥列表的请求类似于获取帐户信息的请求。

为此脚本创建一个名为 do_ssh_keys.py 的新文件,并像上一个一样启动它. 导入 jsonrequests 模块,以便您不必担心 JSON 或 HTTP 协议的细节。

1[label do_ssh_keys.py]
2import json
3import requests
4
5api_token = 'your_api_token'
6api_url_base = 'https://api.digitalocean.com/v2/'
7headers = {'Content-Type': 'application/json',
8           'Authorization': 'Bearer {0}'.format(api_token)}

我们将创建获取SSH密钥的功能类似于我们用于获取帐户信息的功能,但这次我们将更直接地处理错误。

首先,我们将进行API调用,并将响应存储在一个响应响应变量中。 虽然api_url不会与前一个脚本相同;这次它需要指向https://api.digitalocean.com/v2/account/keys

将此代码添加到脚本中:

1[label do_ssh_keys.py]
2...
3def get_ssh_keys():
4
5    api_url = '{0}account/keys'.format(api_url_base)
6
7    response = requests.get(api_url, headers=headers)

现在让我们通过查看响应中的 HTTP 状态代码来添加一些错误处理。如果是200,我们将返回响应的内容作为字典,就像我们以前一样。

将这些行添加到get_ssh_keys函数中:

 1[label do_ssh_keys.py]
 2...
 3
 4    if response.status_code >= 500:
 5        print('[!] [{0}] Server Error'.format(response.status_code))
 6        return None
 7    elif response.status_code == 404:
 8        print('[!] [{0}] URL not found: [{1}]'.format(response.status_code,api_url))
 9        return None  
10    elif response.status_code == 401:
11        print('[!] [{0}] Authentication Failed'.format(response.status_code))
12        return None
13    elif response.status_code == 400:
14        print('[!] [{0}] Bad Request'.format(response.status_code))
15        return None
16    elif response.status_code >= 300:
17        print('[!] [{0}] Unexpected Redirect'.format(response.status_code))
18        return None
19    elif response.status_code == 200:
20        ssh_keys = json.loads(response.content.decode('utf-8'))
21        return ssh_keys
22    else:
23        print('[?] Unexpected Error: [HTTP {0}]: Content: {1}'.format(response.status_code, response.content))
24    return None

此代码通过查看响应中的 HTTP 状态代码来处理六种不同的错误条件。

这些应该是罕见的,它们不是由于请求的问题而造成的,所以我们只打印状态代码。

  • 404 的代码意味着未找到,这可能是源于 URL 中的输入错误。 对于这个错误,我们打印了状态代码和导致的 URL,所以你可以看到为什么它失败了。
  • 401 的代码意味着身份验证失败。 最有可能的原因是错误或缺失的api_key。
  • 300 范围内的代码表示重定向。 数字海洋 API 不会使用重定向,所以这不应该发生,但我们处理错误时,它不会伤害检查任何事情。 我们有很多错误是由程序员认为不会发生的事情引起的。

此时,我们有错误消息和None对象,或者我们有成功和包含零或多个SSH密钥的JSON对象。

 1[label do_ssh_keys.py]
 2...
 3
 4ssh_keys = get_ssh_keys()
 5
 6if ssh_keys is not None:
 7    print('Here are your keys: ')
 8    for key, details in enumerate(ssh_keys['ssh_keys']):
 9        print('Key {}:'.format(key))
10        for k, v in details.items():
11            print('  {0}:{1}'.format(k, v))
12else:
13    print('[!] Request Failed')

由于答案包含一个 SSH 密钥的 列表(或数组),我们希望重复整个列表以查看所有密钥。

我们使用列表,而不仅仅是循环(LINK0),因为我们希望能够告诉我们在任何给定的密钥中有多远。

每个密钥的信息作为一个字典返回,所以我们使用相同的 for k,v in details.items(): 代码,我们在上一个脚本中使用的帐户信息字典。

运行此脚本,您将收到已在您的帐户中 SSH 密钥的列表。

1python get_ssh_keys.py

输出将看起来像这样的东西,取决于你已经在你的帐户中有多少SSH密钥。

 1[secondary_label Output]
 2Here are your keys: 
 3Kcy 0:
 4  id:280518
 5  name:work
 6  fingerprint:96:f7:fb:9f:60:9c:9b:f9:a9:95:01:5c:5c:2c:d5:a0
 7  public_key:ssh-rsa AAAAB5NzaC1yc2cAAAADAQABAAABAQCwgr9Fzc/YTD/V2Ka5I52Rx4I+V2Ka5I52Rx4Ir5LKSCqkQ1Cub+... sammy@work
 8Kcy 1:
 9  id:290536
10  name:home
11  fingerprint:90:1c:0b:ac:fa:b0:25:7c:af:ab:c5:94:a5:91:72:54
12  public_key:ssh-rsa AAAAB5NzaC1yc2cAAAABJQAAAQcAtTZPZmV96P9ziwyr5LKSCqkQ1CubarKfK5r7iNx0RNnlJcqRUqWqSt... sammy@home

现在你可以在你的帐户中列出SSH密钥,这里的最后一个脚本将是一个新密钥添加到列表中。

在我们可以添加新的SSH密钥之前,我们需要生成一个。

但是,对于我们的目的,我们只需要一个简单的密钥。执行这个命令以在 Linux、BSD 或 MacOS 上生成一个新的命令。

1ssh-keygen -t rsa

当被提示时,输入文件来保存密钥,不要提供密码。

1[secondary_label Output]
2Generating public/private rsa key pair.
3Enter file in which to save the key (/home/sammy/.ssh/id_rsa): /home/sammy/.ssh/sammy 
4Created directory '/home/sammy/.ssh'.
5Enter passphrase (empty for no passphrase): 
6Enter same passphrase again: 
7Your identification has been saved in /home/sammy/.ssh/sammy.
8Your public key has been saved in /home/sammy/.ssh/sammy.pub.
9...

请注意公共密钥文件存储在哪里,因为您将需要它用于脚本。

启动一个新的Python脚本,并称之为add_ssh_key.py,然后像其他人一样启动它:

1[label add_ssh_key.py]
2
3import json
4import requests
5
6api_token = 'your_api_token'
7api_url_base = 'https://api.digitalocean.com/v2/'
8headers = {'Content-Type': 'application/json',
9           'Authorization': 'Bearer {0}'.format(api_token)}

我们将使用一个函数来执行我们的请求,但这个函数将略有不同。

创建一个名为add_ssh_key的函数,该函数将接受两个参数:用于新 SSH 密钥的名称和本地系统上的密钥本身的文件名。

 1[label add_ssh_key.py]
 2...
 3
 4def add_ssh_key(name, filename):
 5
 6    api_url = '{0}account/keys'.format(api_url_base)
 7
 8    with open(filename, 'r') as f:
 9        ssh_key = f.readline()
10
11    ssh_key = {'name': name, 'public_key': ssh_key}
12
13    response = requests.post(api_url, headers=headers, json=ssh_key)

字符串 with open(filename, 'r') as f: 在只读模式下打开文件,接下来的字符串从文件中读取第一个(和唯一)行,将其存储在 ssh_key 变量中。

接下来,我们创建一个名为ssh_key的Python字典,其中包含API所期望的名称和值。

但是,当我们发送请求时,有更多的东西是新的,它是POST而不是GET,我们需要在POST请求的体内发送ssh_key,编码为 JSON。

根据API,答案将在成功时为HTTP201,而不是200,答案的体内将包含我们刚刚添加的密钥的细节。

将以下错误处理代码添加到add_ssh_key函数中,它与前一个脚本类似,但这次我们必须寻找代码201而不是200以获得成功:

 1[label add_ssh_key.py]
 2...
 3    if response.status_code >= 500:
 4        print('[!] [{0}] Server Error'.format(response.status_code))
 5        return None
 6    elif response.status_code == 404:
 7        print('[!] [{0}] URL not found: [{1}]'.format(response.status_code,api_url))
 8        return None
 9    elif response.status_code == 401:
10        print('[!] [{0}] Authentication Failed'.format(response.status_code))
11        return None
12    elif response.status_code >= 400:
13        print('[!] [{0}] Bad Request'.format(response.status_code))
14        print(ssh_key )
15        print(response.content )
16        return None
17    elif response.status_code >= 300:
18        print('[!] [{0}] Unexpected redirect.'.format(response.status_code))
19        return None
20    elif response.status_code == 201:
21        added_key = json.loads(response.content)
22        return added_key
23    else:
24        print('[?] Unexpected Error: [HTTP {0}]: Content: {1}'.format(response.status_code, response.content))
25        return None

此函数与之前的函数一样,返回没有或响应内容,因此我们使用与之前相同的方法来检查结果。

接下来,调用函数并处理结果. 将路径传送到您新创建的 SSH 密钥作为第二个参数:

 1[label add_ssh_key.py]
 2...
 3add_response = add_ssh_key('tutorial_key', '/home/sammy/.ssh/sammy.pub')
 4
 5if add_response is not None:
 6    print('Your key was added: ' )
 7    for k, v in add_response.items():
 8        print('  {0}:{1}'.format(k, v))
 9else:
10    print('[!] Request Failed')

运行此脚本,您将收到回复,告诉您您的新密钥已被添加。

1python add_ssh_key.py

输出将看起来像这样:

1[secondary_label Output]
2Your key was added: 
3  ssh_key:{'id': 9458326, 'name': 'tutorial_key', 'fingerprint': '64:76:37:77:c8:c7:26:05:f5:7b:6b:e1:bb:d6:80:da', 'public_key': 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCUtY9aizEcVJ65/O5CE6tY8Xodrkkdh9BB0GwEUE7eDKtTh4NAxVjXc8XdzCLKtdMwfSg9xwxSi3axsVWYWBUhiws0YRxxMNTHCBDsLFTJgCFC0JCmSLB5ZEnKl+Wijbqnu2r8k2NoXW5GUxNVwhYztXZkkzEMNT78TgWBjPu2Tp1qKREqLuwOsMIKt4bqozL/1tu6oociNMdLOGUqXNrXCsOIvTylt6ROF3a5UnVPXhgz0qGbQrSHvCEfuKGZ1kw8PtWgeIe7VIHbS2zTuSDCmyj1Nw1yOTHSAqZLpm6gnDo0Lo9OEA7BSFr9W/VURmTVsfE1CNGSb6c6SPx0NpoN sammy@tutorial-test'}

如果你忘了更改成功条件以搜索HTTP201而不是200,你会看到一个错误报告,但关键仍然被添加了。你的错误处理会告诉你状态代码是201

一旦您使用此脚本成功添加了密钥,请重新运行它,看看当您尝试添加已经存在的密钥时会发生什么。

该 API 将发送 HTTP 422 响应,您的脚本将转换为SSH 密钥已在您的帐户中使用的消息:

1[secondary_label Output]
2[!] [422] Bad Request
3{'name': 'tutorial_key', 'public_key': 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCUtY9aizEcVJ65/O5CE6tY8Xodrkkdh9BB0GwEUE7eDKtTh4NAxVjXc8XdzCLKtdMwfSg9xwxSi3axsVWYWBUhiws0YRxxMNTHCBDsLFTJgCFC0JCmSLB5ZEnKl+Wijbqnu2r8k2NoXW5GUxNVwhYztXZkkzEMNT78TgWBjPu2Tp1qKREqLuwOsMIKt4bqozL/1tu6oociNMdLOGUqXNrXCsOIvTylt6ROF3a5UnVPXhgz0qGbQrSHvCEfuKGZ1kw8PtWgeIe7VIHbS2zTuSDCmyj1Nw1yOTHSAqZLpm6gnDo0Lo9OEA7BSFr9W/VURmTVsfE1CNGSb6c6SPx0NpoN sammy@tutorial-test'}
4b'{"id":"unprocessable_entity","message":"SSH Key is already in use on your account"}'
5[!] Request Failed

现在,再次运行get_ssh_keys.py脚本,您将在列表中看到新添加的密钥。

有了较小的修改,这两种脚本可以是您需要时添加新的SSH密钥到您的DigitalOcean帐户的快速方法。

让我们看看另一个API,看看你刚刚学到的技能是如何翻译的。

步骤 4 – 使用不同的 API

您对使用 DigitalOcean API 所学过的一切都直接适用于使用 GitHub API。

了解GitHub API,就像你在DigitalOcean上做的那样。搜索 API文档,然后浏览 Overview部分。

首先,你会注意到所有API URL 都有一个共同的根源: https://api.github.com/. 你知道如何在代码中使用这个变量来简化和减少错误的潜力。

GitHub的API使用JSON作为其请求和响应格式,就像DigitalOcean一样,所以你知道如何提出这些请求并处理答案。

答案包括 HTTP 响应标题中的率限制信息,使用几乎相同的名称和与 DigitalOcean 完全相同的值。

GitHub 使用 OAuth 进行身份验证,你可以在请求标题中发送你的代币. 该代币的细节略有不同,但它的使用方式与你如何使用 DigitalOcean 的 API 相同。

GitHub 鼓励使用请求标题来表示您想要使用的 API 版本,您知道如何在 Python 中将标题添加到请求中。

GitHub 还希望您在请求中使用一个独特的用户代理字符串,这样他们就可以更容易地找到您,如果您的代码导致问题。

GitHub API 使用相同的 HTTP 请求方法,但也使用一种名为PATCH的新方法来执行某些操作。GitHub API 使用GET来读取信息,POST来添加新项目,以及PATCH来修改现有项目。

并非所有 GitHub API 呼叫都需要身份验证,例如,您可以获得用户存储库的列表,而不需要访问代码,让我们创建一个脚本来执行该请求并显示结果。

我们将简化本脚本中的错误处理,并只使用一个陈述来处理所有可能的错误. 您不总是需要代码来处理每种错误单独,但这是一个很好的习惯,做一些错误条件,如果只是提醒自己,事情并不总是按照你期望的方式。

在您的编辑器中创建一个名为github_list_repos.py的新文件,并添加以下内容,这应该看起来很熟悉:

1[label github_list_repos.py]
2import json
3import requests
4
5api_url_base = 'https://api.github.com/'
6headers = {'Content-Type': 'application/json',
7           'User-Agent': 'Python Student',
8           'Accept': 'application/vnd.github.v3+json'}

api_url_base是所有GitHub API开始的地方。

标题包括GitHub在其概述中提到的两个可选标题,加上一个称我们在我们的请求中发送JSON格式数据。

虽然这是一个小脚本,但我们仍然会定义一个函数,以保持我们的逻辑模块化,并封装请求的逻辑。 通常,你的小脚本会变成更大的脚本,所以对这一点有帮助。

 1[label github_list_repos.py]
 2
 3...
 4def get_repos(username):
 5
 6    api_url = '{}orgs/{}/repos'.format(api_url_base, username)
 7
 8    response = requests.get(api_url, headers=headers)
 9
10    if response.status_code == 200:
11        return (response.content)
12    else:
13        print('[!] HTTP {0} calling [{1}]'.format(response.status_code, api_url))
14        return None

在函数中,我们从api_url_base中构建URL,我们感兴趣的用户名和URL的静态部分,告诉GitHub我们想要存储列表,然后我们检查响应的HTTP状态代码,以确保它是200(成功)。

现在,拨打函数并输入您想要使用的GitHub用户名,我们将使用octokit为此示例,然后在屏幕上打印结果:

1[label github_list_repos.py]
2
3...
4repo_list = get_repos('octokit')
5
6if repo_list is not None:
7    print(repo_list)
8else:
9    print('No Repo List Found')

保存文件并运行脚本,查看您指定的用户的存储库。

1python github_list_repos.py

您将在输出中看到大量数据,因为在本示例中,我们没有将答案解析为 JSON,也没有将结果过滤到特定键。

一旦关于这些GitHub API的好事是,你可以访问您不需要身份验证的请求,直接在您的Web浏览器中,这允许您将答案与您在脚本中看到的内容进行比较。

到目前为止,您已经知道如何阅读文档并编写必要的代码,以发送更具体的请求,以支持您自己的目标使用GitHub API。

您可以在本教程中找到所有示例的完整代码 GitHub 上此存储库

结论

在本教程中,您了解了如何为两种不同类型的服务使用Web API. 您看到了包含错误处理代码的重要性,以便更容易进行调试,并使脚本更强大。

更重要的是,当您学习任何新的 Web API 时,您现在有一个可重复的过程:

  1. 查找文档并阅读介绍,了解如何与API互动的基本知识。 2 如果你需要一个身份验证令牌,然后写一个模块化脚本,使用基本的错误处理来发送一个简单的请求,响应错误,并处理响应。

现在,巩固这个新获得的知识,并找到另一个API来使用,甚至是您在这里使用的API之一的另一个功能。

Published At
Categories with 技术
comments powered by Disqus