介绍
一个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 Text或 Atom用于任何平台都是很好的选择。
- 一个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/,并尝试了解如何发送请求的基本知识,以及在响应中期望什么。
- 请求看起来是什么样子? 这些都只是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_info
为None
),我们会打印错误消息。
让我们在这里暂停一分钟。这个如果
声明中含有双消极的声明可能起初感觉不舒服,但它是一种常见的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
的新文件,并像上一个一样启动它. 导入 json
和 requests
模块,以便您不必担心 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 时,您现在有一个可重复的过程:
- 查找文档并阅读介绍,了解如何与API互动的基本知识。 2 如果你需要一个身份验证令牌,然后写一个模块化脚本,使用基本的错误处理来发送一个简单的请求,响应错误,并处理响应。
现在,巩固这个新获得的知识,并找到另一个API来使用,甚至是您在这里使用的API之一的另一个功能。