iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何调用Web API
  • 190
分享到

如何调用Web API

2023-06-29 14:06:15 190人浏览 安东尼
摘要

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

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

--结束END--

本文标题: 如何调用Web API

本文链接: https://www.lsjlt.com/news/325421.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 如何调用Web API
    本篇内容介绍了“如何调用Web API”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!第一步:打开开发者工具,找一个 JSON 响应...
    99+
    2023-06-29
  • 在C# Winform里如何调用WEB Service API
    小编给大家分享一下在C# Winform里如何调用WEB Service API,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!搭建了一个很简单的WEB Service,现在以C# WinForm调用WEB Service ...
    99+
    2023-06-18
  • 如何调用API
    小编给大家分享一下如何调用API,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!给大家分享一个微信域名封杀检测api,平时用微信打开一些公司的网址,结果发现被停止访...
    99+
    2023-06-04
  • C#如何调用API
    这篇文章主要介绍C#如何调用API,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!我们有时需要遍历某个目录下的文件和子目录,可以使用System.IO.DirectoryInfo.GetDirectories或GetF...
    99+
    2023-06-17
  • C#怎么使用RestClient调用Web API
    这篇文章主要介绍“C#怎么使用RestClient调用Web API”,在日常操作中,相信很多人在C#怎么使用RestClient调用Web API问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家...
    99+
    2023-06-30
  • python中API如何调用
    本文小编为大家详细介绍“python中API如何调用”,内容详细,步骤清晰,细节处理妥当,希望这篇“python中API如何调用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。APIAPI:简单来说就是一组协议、一...
    99+
    2023-07-02
  • Python中如何调用API
    在Python中调用API的一种常见方式是使用`requests`库。以下是一个简单的示例,演示如何通过GET请求调用一个API并获...
    99+
    2023-08-28
    python
  • VB.NET如何调用Web Service
    这篇文章将为大家详细讲解有关VB.NET如何调用Web Service,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。VB.NET调用Web Service提供服务来编写数据库应用程序的具体步骤,: 启动V...
    99+
    2023-06-17
  • JavaScript中的Web API如何使用
    这篇“JavaScript中的Web API如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看...
    99+
    2024-04-02
  • python如何调用api接口
    要调用 API 接口,可以使用 Python 中的 requests 库。以下是一个简单的示例:```pythonimport re...
    99+
    2023-09-07
    python
  • 微信框架API如何调用
    这篇文章主要介绍“微信框架API如何调用”,在日常操作中,相信很多人在微信框架API如何调用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”微信框架API如何调用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-05
  • ASP.NET延迟调用或多次调用第三方Web API服务
    本篇体验使用HttpClient消费ASP.NET Web API服务,例子比较简单。 依次点击"文件","新建","项目"...
    99+
    2022-11-13
    ASP.NET 延迟调用 多次调用 第三方Web API服务
  • web中如何优化尾调用
    这篇文章主要为大家展示了“web中如何优化尾调用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“web中如何优化尾调用”这篇文章吧。尾调用从字面理解,自然而言就是在函数的尾部返回一个函数的调用,通...
    99+
    2023-06-27
  • PHP学习笔记:Web服务与API的调用
    一、引言随着互联网的发展,Web服务和API的使用越来越普遍。PHP作为一种被广泛使用的服务器端脚本语言,具备丰富的功能和强大的扩展性,在Web服务和API的调用方面也表现出色。本文将讨论如何使用PHP调用Web服务和API,并给出具体的代...
    99+
    2023-10-21
    API PHP Web服务
  • API的定义|API优势|什么是电商API?如何调用?
    API的定义 API(Application Programming Interface)是“应用编程接口”的缩写,指的是一些预先定义的接口(如函数、HTTP接口),或是软件系统不同组成部分衔接的约定。 API的意思是: 简单来说就...
    99+
    2023-09-06
    python pandas 开发语言
  • Python如何调用API发送邮件
    这篇文章将为大家详细讲解有关Python如何调用API发送邮件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Python 调用 APIPython 调用 API 非常简单,通常需要一个称为 request...
    99+
    2023-06-14
  • 调用无文档说明的 Web API过程描述
    目录第一步:打开开发者工具,找一个 JSON 响应第二步:复制为 cURL第三步:去掉不相关的请求头第四步:在 Python 中发请求运行结束(理论上)适用于所有场景问题 1:会话 ...
    99+
    2024-04-02
  • 如何用Identity Server 4来保护 Python web api
    这篇文章将为大家详细讲解有关如何用Identity Server 4来保护 Python web api,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。目前正在使用asp.net core 2...
    99+
    2023-06-19
  • Java/Web如何调用Hadoop进行MapReduce
    这篇文章主要为大家展示了“Java/Web如何调用Hadoop进行MapReduce”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java/Web如何调用Hadoop进行MapReduce”这篇...
    99+
    2023-05-30
    java hadoop mapreduce
  • python如何实现API的调用详解
    目录前言API数据接口API的调用和数据接口的调用调用的基础-请求方法几种常见API调用实例百度AI相关API百度地图API有道APIuuidsign常用API分享总结前言 在日常工...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作