我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何调用Web API

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何调用Web API

本篇内容介绍了“如何调用Web API”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

第一步:打开开发者工具,找一个 JSON 响应

我浏览了 https://hangouts.google.com,在 Firefox 的开发者工具中打开“网络Network”标签,找到一个 JSON 响应。你也可以使用 Chrome 的开发者工具。

打开之后界面如下图:

如何调用Web API

找到其中一条 “类型Type” 列显示为 json 的请求。

为了找一条感兴趣的请求,我找了好一会儿,突然我找到一条 “people” 的端点,看起来是返回我们的联系人信息。听起来很有意思,我们来看一下。

第二步:复制为 cURL

下一步,我在感兴趣的请求上右键,点击 “复制Copy” -> “复制为 cURLCopy as cURL”。

然后我把 curl 命令粘贴到终端并运行。下面是运行结果:

$ curl 'https://people-pa.clients6.google.com/v2/people/?key=REDACTED' -X POST ........ (省略了大量请求标头)Warning: Binary output can mess up your terminal. Use "--output -" to tell Warning: curl to output it to your terminal anyway, or consider "--output Warning: <FILE>" to save to a file.

你可能会想 &mdash;&mdash; 很奇怪,“二进制的输出在你的终端上无法正常显示” 是什么错误?原因是,浏览器默认情况下发给服务器的请求头中有 Accept-Encoding: gzip, deflate 参数,会把输出结果进行压缩。

我们可以通过管道把输出传递给 gunzip 来解压,但是我们发现不带这个参数进行请求会更简单。因此我们去掉一些不相关的请求头。

第三步:去掉不相关的请求头

下面是我从浏览器获得的完整 curl 命令。有很多行!我用反斜杠(\)把请求分开,这样每个请求头占一行,看起来更清晰:

curl 'https://people-pa.clients6.google.com/v2/people/?key=REDACTED' \-X POST \-H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0' \-H 'Accept: */*' \-H 'Accept-Language: en' \-H 'Accept-Encoding: gzip, deflate' \-H 'X-HTTP-Method-Override: GET' \-H 'Authorization: SAPISIDHASH REDACTED' \-H 'Cookie: REDACTED'-H 'Content-Type: application/x-www-form-urlencoded' \-H 'X-Goog-AuthUser: 0' \-H 'Origin: https://hangouts.google.com' \-H 'Connection: keep-alive' \-H 'Referer: https://hangouts.google.com/' \-H 'Sec-Fetch-Dest: empty' \-H 'Sec-Fetch-Mode: cors' \-H 'Sec-Fetch-Site: same-site' \-H 'Sec-GPC: 1' \-H 'DNT: 1' \-H 'Pragma: no-cache' \-H 'Cache-Control: no-cache' \-H 'TE: trailers' \--data-raw 'personId=101777723309&personId=1175339043204&personId=1115266537043&personId=116731406166&extensionSet.extensionNames=HANGOUTS_ADDITIONAL_DATA&extensionSet.extensionNames=HANGOUTS_OFF_NETWORK_GAIA_GET&extensionSet.extensionNames=HANGOUTS_PHONE_DATA&includedProfileStates=ADMIN_BLOCKED&includedProfileStates=DELETED&includedProfileStates=PRIVATE_PROFILE&mergedPersonSourceOptions.includeAffinity=CHAT_AUTOCOMPLETE&coreIdParams.useRealtimeNotificationExpandedAcls=true&requestMask.includeField.paths=person.email&requestMask.includeField.paths=person.gender&requestMask.includeField.paths=person.in_app_reachability&requestMask.includeField.paths=person.metadata&requestMask.includeField.paths=person.name&requestMask.includeField.paths=person.phone&requestMask.includeField.paths=person.photo&requestMask.includeField.paths=person.read_only_profile_info&requestMask.includeField.paths=person.organization&requestMask.includeField.paths=person.location&requestMask.includeField.paths=person.cover_photo&requestMask.includeContainer=PROFILE&requestMask.includeContainer=DOMAIN_PROFILE&requestMask.includeContainer=CONTACT&key=REDACTED'

第一眼看起来内容有很多,但是现在你不需要考虑每一行是什么意思。你只需要把不相关的行删掉就可以了。

我通常通过删掉某行查看是否有错误来验证该行是不是可以删除 &mdash;&mdash; 只要请求没有错误就一直删请求头。通常情况下,你可以删掉 Accept*RefererSec-*DNTUser-Agent 和缓存相关的头。

在这个例子中,我把请求删成下面的样子:

curl 'https://people-pa.clients6.google.com/v2/people/?key=REDACTED' \-X POST \-H 'Authorization: SAPISIDHASH REDACTED' \-H 'Content-Type: application/x-www-form-urlencoded' \-H 'Origin: https://hangouts.google.com' \-H 'Cookie: REDACTED'\--data-raw 'personId=101777723309&personId=1175339043204&personId=1115266537043&personId=116731406166&extensionSet.extensionNames=HANGOUTS_ADDITIONAL_DATA&extensionSet.extensionNames=HANGOUTS_OFF_NETWORK_GAIA_GET&extensionSet.extensionNames=HANGOUTS_PHONE_DATA&includedProfileStates=ADMIN_BLOCKED&includedProfileStates=DELETED&includedProfileStates=PRIVATE_PROFILE&mergedPersonSourceOptions.includeAffinity=CHAT_AUTOCOMPLETE&coreIdParams.useRealtimeNotificationExpandedAcls=true&requestMask.includeField.paths=person.email&requestMask.includeField.paths=person.gender&requestMask.includeField.paths=person.in_app_reachability&requestMask.includeField.paths=person.metadata&requestMask.includeField.paths=person.name&requestMask.includeField.paths=person.phone&requestMask.includeField.paths=person.photo&requestMask.includeField.paths=person.read_only_profile_info&requestMask.includeField.paths=person.organization&requestMask.includeField.paths=person.location&requestMask.includeField.paths=person.cover_photo&requestMask.includeContainer=PROFILE&requestMask.includeContainer=DOMAIN_PROFILE&requestMask.includeContainer=CONTACT&key=REDACTED'

这样我只需要 4 个请求头:AuthorizationContent-TypeOrigin 和 Cookie。这样容易管理得多。

第四步:在 Python 中发请求

现在我们知道了我们需要哪些请求头,我们可以把 curl 命令翻译进 Python 程序!这部分是相当机械化的过程,目标仅仅是用 Python 发送与 cUrl 相同的数据。

下面是代码实例。我们使用 Python 的 requests 包实现了与前面 curl 命令相同的功能。我把整个长请求分解成了元组的数组,以便看起来更简洁。

import requestsimport urllibdata = [    ('personId','101777723'), # I redacted these IDs a bit too    ('personId','117533904'),    ('personId','111526653'),    ('personId','116731406'),    ('extensionSet.extensionNames','HANGOUTS_ADDITIONAL_DATA'),    ('extensionSet.extensionNames','HANGOUTS_OFF_NETWORK_GAIA_GET'),    ('extensionSet.extensionNames','HANGOUTS_PHONE_DATA'),    ('includedProfileStates','ADMIN_BLOCKED'),    ('includedProfileStates','DELETED'),    ('includedProfileStates','PRIVATE_PROFILE'),    ('mergedPersonSourceOptions.includeAffinity','CHAT_AUTOCOMPLETE'),    ('coreIdParams.useRealtimeNotificationExpandedAcls','true'),    ('requestMask.includeField.paths','person.email'),    ('requestMask.includeField.paths','person.gender'),    ('requestMask.includeField.paths','person.in_app_reachability'),    ('requestMask.includeField.paths','person.metadata'),    ('requestMask.includeField.paths','person.name'),    ('requestMask.includeField.paths','person.phone'),    ('requestMask.includeField.paths','person.photo'),    ('requestMask.includeField.paths','person.read_only_profile_info'),    ('requestMask.includeField.paths','person.organization'),    ('requestMask.includeField.paths','person.location'),    ('requestMask.includeField.paths','person.cover_photo'),    ('requestMask.includeContainer','PROFILE'),    ('requestMask.includeContainer','DOMAIN_PROFILE'),    ('requestMask.includeContainer','CONTACT'),    ('key','REDACTED')]response = requests.post('https://people-pa.clients6.google.com/v2/people/?key=REDACTED',    headers={        'X-HTTP-Method-Override': 'GET',        'Authorization': 'SAPISIDHASH REDACTED',        'Content-Type': 'application/x-www-form-urlencoded',        'Origin': 'https://hangouts.google.com',        'Cookie': 'REDACTED',    },    data=urllib.parse.urlencode(data),)print(response.text)

我执行这个程序后正常运行 &mdash;&mdash; 输出了一堆 JSON 数据!太棒了!

你会注意到有些地方我用 REDACTED 代替了,因为如果我把原始数据列出来你就可以用我的账号来访问谷歌论坛了,这就很不好了。

运行结束

现在我可以随意修改 Python 程序,比如传入不同的参数,或解析结果等。

我不打算用它来做其他有意思的事了,因为我压根对这个 API 没兴趣,我只是用它来阐述请求 API 的过程。

但是你确实可以对返回的一堆 JSON 做一些处理。

curlconverter 看起来很强大

有人评论说可以使用 https://curlconverter.com/ 自动把 curl 转换成 Python(和一些其他的语言!),这看起来很神奇 &mdash;&mdash; 我都是手动转的。我在这个例子里使用了它,看起来一切正常。

追踪 API 的处理过程并不容易

我不打算夸大追踪 API 处理过程的难度 &mdash;&mdash; API 的处理过程并不明显!我也不知道传给这个谷歌论坛 API 的一堆参数都是做什么的!

但是有一些参数看起来很直观,比如 

requestMask.includeField.paths=person.email 

可能表示“包含每个人的邮件地址”。因此我只关心我能看懂的参数,不关心看不懂的。

(理论上)适用于所有场景

可能有人质疑 &mdash;&mdash; 这个方法适用于所有场景吗?

答案是肯定的 &mdash;&mdash; 浏览器不是魔法!浏览器发送给你的服务器的所有信息都是 HTTP 请求。因此如果我复制了浏览器发送的所有的 HTTP 请求头,那么后端就会认为请求是从我的浏览器发出的,而不是用 Python 程序发出的。

当然,我们去掉了一些浏览器发送的请求头,因此理论上后端是可以识别出来请求是从浏览器还是 Python 程序发出的,但是它们通常不会检查。

这里有一些对读者的告诫 &mdash;&mdash; 一些谷歌服务的后端会通过令人难以理解(对我来说是)方式跟前端通信,因此即使理论上你可以模拟前端的请求,但实际上可能行不通。可能会遭受更多攻击的大型 API 会有更多的保护措施。

我们已经知道了如何调用没有文档说明的 API。现在我们再来聊聊可能遇到的问题。

问题 1:会话 cookie 过期

一个大问题是我用我的谷歌会话 cookie 作为身份认证,因此当我的浏览器会话过期后,这个脚本就不能用了。

这意味着这种方式不能长久使用(我宁愿调一个真正的 API),但是如果我只是要一次性快速抓取一小组数据,那么可以使用它。

问题 2:滥用

如果我正在请求一个小网站,那么我的 Python 脚本可能会把服务打垮,因为请求数超出了它们的处理能力。因此我请求时尽量谨慎,尽量不过快地发送大量请求。

这尤其重要,因为没有官方 API 的网站往往是些小网站且没有足够的资源。

很明显在这个例子中这不是问题 &mdash;&mdash; 我认为在写这篇文章的过程我一共向谷歌论坛的后端发送了 20 次请求,他们肯定可以处理。

如果你用自己的账号身份过度访问这个 API 并导致了故障,那么你的账号可能会被暂时封禁(情理之中)。

我只下载我自己的数据或公共的数据 &mdash;&mdash; 我的目的不是寻找网站的弱点。

“如何调用Web API”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何调用Web API

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何调用Web API

本篇内容介绍了“如何调用Web API”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!第一步:打开开发者工具,找一个 JSON 响应我浏览了
2023-06-29

在C# Winform里如何调用WEB Service API

小编给大家分享一下在C# Winform里如何调用WEB Service API,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!搭建了一个很简单的WEB Service,现在以C# WinForm调用WEB Service
2023-06-18

如何调用API

小编给大家分享一下如何调用API,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!给大家分享一个微信域名封杀检测api,平时用微信打开一些公司的网址,结果发现被停止访
2023-06-04

C#如何调用API

这篇文章主要介绍C#如何调用API,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!我们有时需要遍历某个目录下的文件和子目录,可以使用System.IO.DirectoryInfo.GetDirectories或GetF
2023-06-17

C#怎么使用RestClient调用Web API

这篇文章主要介绍“C#怎么使用RestClient调用Web API”,在日常操作中,相信很多人在C#怎么使用RestClient调用Web API问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#怎么使用R
2023-06-30

python中API如何调用

本文小编为大家详细介绍“python中API如何调用”,内容详细,步骤清晰,细节处理妥当,希望这篇“python中API如何调用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。APIAPI:简单来说就是一组协议、一
2023-07-02

Python中如何调用API

在Python中调用API的一种常见方式是使用`requests`库。以下是一个简单的示例,演示如何通过GET请求调用一个API并获取响应数据:```pythonimport requests# 定义API的URLapi_url = "ht
2023-08-28

VB.NET如何调用Web Service

这篇文章将为大家详细讲解有关VB.NET如何调用Web Service,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。VB.NET调用Web Service提供服务来编写数据库应用程序的具体步骤,:1. 启
2023-06-17

python如何调用api接口

要调用 API 接口,可以使用 Python 中的 requests 库。以下是一个简单的示例:```pythonimport requests# API 请求的 URLurl = 'https://api.example.com/endp
2023-09-07

微信框架API如何调用

这篇文章主要介绍“微信框架API如何调用”,在日常操作中,相信很多人在微信框架API如何调用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”微信框架API如何调用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧
2023-06-05

ASP.NET延迟调用或多次调用第三方Web API服务

这篇文章介绍了ASP.NET延迟调用或多次调用第三方Web API服务的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2022-11-13

web中如何优化尾调用

这篇文章主要为大家展示了“web中如何优化尾调用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“web中如何优化尾调用”这篇文章吧。尾调用从字面理解,自然而言就是在函数的尾部返回一个函数的调用,通
2023-06-27

Python如何调用API发送邮件

这篇文章将为大家详细讲解有关Python如何调用API发送邮件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Python 调用 APIPython 调用 API 非常简单,通常需要一个称为 request
2023-06-14

PHP学习笔记:Web服务与API的调用

一、引言随着互联网的发展,Web服务和API的使用越来越普遍。PHP作为一种被广泛使用的服务器端脚本语言,具备丰富的功能和强大的扩展性,在Web服务和API的调用方面也表现出色。本文将讨论如何使用PHP调用Web服务和API,并给出具体的代
2023-10-21

如何用Identity Server 4来保护 Python web api

这篇文章将为大家详细讲解有关如何用Identity Server 4来保护 Python web api,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。目前正在使用asp.net core 2
2023-06-19

Java/Web如何调用Hadoop进行MapReduce

这篇文章主要为大家展示了“Java/Web如何调用Hadoop进行MapReduce”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java/Web如何调用Hadoop进行MapReduce”这篇
2023-05-30

php如何调用第三方api接口

要调用第三方API接口,可以使用PHP中的curl函数,示例如下:```php// 第三方API的URL$url = 'http://example.com/api';// 请求参数$data = ['param1' => 'value1'
2023-08-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录