当前位置:主页 > 区块链 > 区块链技术 > web调用api接口实例

如何实现在纯Web端完成各类API调试?

2023-06-02 15:43:56 | 来源:CSDN | 作者:张涛
这篇文章主要介绍了如何实现在纯Web端完成各类API调试?的相关资料,需要的朋友可以参考下本文详细内容介绍

在软件开发过程中,对于各类 API 的调试工作至关重要。API 调试是验证和测试应用程序接口的有效性和正确性的关键步骤。传统的 API 调试方法通常依赖于独立的工具或桌面应用程序,限制了调试过程的灵活性和效率。

为推动 API 调试向更便捷、高效的方向发展,越来越多的开发人员开始寻求在纯 Web 端完成各类 API 调试的解决方案。纯 Web 端的 API 调试具有许多优势,包括无需安装额外软件、跨平台支持、便于团队协作等。本文将以开源项目 AREX 为例为大家介绍如何在 Web 端实现对各类 API 的调试功能。

AREX (http://arextest.com/)是一款开源的基于真实请求与数据的自动化回归测试平台,利用 Java Agent 技术与比对技术,通过流量录制回放能力实现快速有效的回归测试。同时提供了接口测试、接口比对测试等丰富的自动化测试功能。

难点一:跨域限制

要想在纯 Web 端实现各类 API 的调试工作,首先要解决的难题是处理浏览器的跨域限制。

什么是跨域

浏览器跨域问题是指在 Web 开发中,当使用 JavaScript 代码从一个域名的网页访问另一个域名的资源时会遇到的限制。浏览器实施了一种安全策略,称为同源策略(Same-Origin Policy), 用于保护用户信息的安全。同源策略要求网页中的 JavaScript 只能访问与其来源(协议、域名和端口号)相同的资源,而对于不同域名的资源访问会受到限制。

由于浏览器存在跨域限制,我们不能在浏览器端随心所欲地发送 HTTP 请求,这是浏览器的安全策略决定的。

解决方案

经调研,突破此限制的方法有两种:分别是 Chrome 插件代理和服务端代理,以下是两种方法的比较。

权衡下来 AREX 选择了 Chrome 插件代理的方法,其原理是利用了 Chrome 插件中 background 可以发送跨域请求的能力,我们将浏览器端拦截到的请求通过 window.postmassage 与 Chrome 插件的 background 进行通信(其中通信还需要 Chrome 插件的 content-script 作为数据桥梁)。

具体实现如下:

在页面脚本中

生成一个随机的字符串,并将其转换为字符串形式,存储在 tid 变量中。

使用 window.postMessage() 方法发送一条消息到其他扩展程序,消息包括一个类型为 `AREX_EXTENSION_REQUEST` 的标识、tid、以及 params 参数。

添加一个 message 事件监听器 receiveMessage,用于接收其他扩展程序发送的消息。

在 receiveMessage 函数中,检查接收到的消息是否为类型为 AREX_EXTENSION_RES,并且 tid 与之前发送的消息的tid 相匹配。如果匹配成功,则移除事件监听器。

在内容脚本中

在后台脚本中

难点二:API 调试

上述已经解决了跨域问题,接下来就是如何实现 API 调试的功能。

解决方案

Postman 是业内成熟的 API 调试工具,我们站在了 Postman 这位巨人的肩膀上,在 AREX 中引入了 Postman 的 JavaScript 沙盒,使用它的沙盒运行前置脚本、后置脚本以及断言来调试 API。

以下是 AREX 请求的流程图:

当点击发送请求的时候,会将表单中的数据汇聚到一起,数据结构为:

这是 AREX 的数据结构,我们会将其转换成 Postman 的数据结构。之后调用 PostmanRuntime.Runner() 方法,将转换好了的 Postman 数据结构和当前所选的环境变量传入,Runner 会执行 preRequestScript 和 testScript 脚本。`preRequestScript` 发生在请求之前,可以在其中穿插请求以及对请求参数、环境变量进行操作,`testScript` 发生在请求之后,可以对 response 返回数据进行断言操作,并且脚本中也可以通过 `console.log` 输出数据,在控制台进行调试。

在 Postman 沙盒中也存在跨域问题,由于 Postman 沙盒的集成度非常高,为了确保与 PostmanRuntime 的同步以及方便性,我们采用了 Ajax 拦截技术。通过在浏览器端拦截 Ajax 请求,我们可以对请求进行修改、添加自定义逻辑或者进行其他处理操作。这样可以实现对请求和响应的全局控制和定制化。

当 Postman 沙盒发送请求时,会携带一个名为 "postman-token" 的请求头。我们拦截到这个 Ajax 请求后,会将请求参数进行拼装,并通过 window.postMessage 发送给浏览器插件。浏览器插件再次构建 fetch 请求,将数据返回给 Postman 沙盒,使其输出最终结果,包括响应(response)、测试结果(testResult)和控制台日志(console.log)。需要注意的是,responseType 必须指定为 arraybuffer。

具体流程如下:

使用 xspy.onRequest() 方法注册一个请求处理程序。这个处理程序接受两个参数:request 和 sendResponse。request 参数包含请求的相关信息,例如方法、URL、头部、请求体等。sendResponse 是一个回调函数,用于发送响应给请求方。

在处理程序中,通过检查请求的头部中是否存在 postman-token 来判断请求是否来自 Postman。

如果存在该头部,表示请求是通过 Postman 发送的。则使用 AgentAxios 发起一个新的请求,使用原始请求的方法、URL、头部和请求体。AgentAxios 返回一个 agentData 对象,其中包含了响应的状态码、头部和数据等信息。创建一个名为 dummyResponse 的响应对象,包含了与原始请求相关的信息。dummyResponse 的 status 字段为 agentData 的状态码,headers 字段为将 agentData 的头部数组转换为对象格式的结果,ajaxType 字段为字符串 xhr,responseType 字段为字符串 arraybuffer,response 字段为将 agentData 的数据转换为 JSON 字符串并用 Buffer 包装的结果。最后,使用 sendResponse(dummyResponse) 将响应发送给请求方。

如果请求不是来自 Postman,则直接调用 sendResponse(),表示不返回任何响应。

难点三:二进制对象序列化传递

还有一点值得一提,对于 `x-www-form-urlencoded` 和 `Raw` 类型的请求,由于它们都是普通的 JSON 对象,处理起来比较容易。但是对于 `form-data` 和 `binary` 类型的请求,需要支持传输二进制文件负载。然而,Chrome 插件的 `postMessage` 通信方式不支持直接传递二进制对象,导致无法直接处理这两种类型的请求。

解决方案

为了解决这个问题,AREX 采用了 base64 编码技术。在用户选择文件时,AREX 会将二进制文件转换为 base64 字符串,然后进行传输。在 Chrome 插件端,AREX 会将 base64 数据进行解码,并用于构建实际的 `fetch` 请求。这样可以绕过直接传递二进制对象的限制。

就这个问题我们采用了 base64 编码技术,在选择文件时我们会将二进制文件转换成 base64 字符串,再进行传输,Chrome 插件端会将 base64 数据解码并用于构建实际的 `fetch` 请求。

这个流程图描述了将 FormData 中的二进制文件转换为 Base64 字符串,并通过 Chrome 插件代理将其转换回文件并进行进一步处理的过程。

form-data binary(A):表示一个包含二进制文件的 FormData 表单数据。

FileReader(B):使用 FileReader 对象来读取二进制文件。

readAsDataURL base64 string:FileReader 使用 readAsDataURL 方法将二进制文件读取为 Base64 字符串。

Chrome 插件代理(C):Base64 字符串经过读取操作后,传递给 Chrome 插件代理进行进一步处理。

base64 string:表示经过 FileReader 读取二进制文件后得到的 Base64 字符串。

Uint8Array(D):在 Chrome 插件代理中,将 Base64 字符串转换为 Uint8Array。

File(E):使用 Uint8Array 的数据创建一个新的 File 对象。

fetch(F):将新创建的 File 对象通过 fetch 方法或其他方式进行进一步处理,例如上传到服务器或进行其他操作。

代码分析

以下是代码层面的分析:

toBase64 函数接受一个 File 对象作为参数,并返回一个 Promise 对象,该 Promise 对象将解析为表示文件的 Base64 字符串。

在函数内部,创建了一个 FileReader 对象。通过调用 reader.readAsDataURL(file) 将文件读取为 Data URL。当读取操作完成时,通过 reader.onload 事件处理程序将读取结果解析为字符串,并使用 resolve 将其传递给 Promise。如果发生错误,将使用 reject 将错误传递给 Promise。base64ToFile 函数接受两个参数:dataurl(Base64 字符串)和 filename(文件名),并返回一个 File 对象。

首先,将 dataurl 使用逗号分割成数组 arr,如果分割结果为空,则将其设为包含一个空字符串的数组。通过正则表达式匹配 arr[0] 中的内容,提取出 MIME 类型,即数据的类型。

使用 atob 将 Base64 字符串解码为二进制字符串 bstr。创建一个长度为 n 的 Uint8Array 数组 u8arr。使用循环遍历 bstr,将每个字符的 Unicode 编码放入 u8arr 中。

最后,使用 File 构造函数创建并返回一个新的 File 对象,其中包含了从 u8arr 中读取的文件数据、文件名和 MIME 类型。导出 base64ToFile 函数,以便在其他地方使用。

以上就是如何实现在纯Web端完成各类API调试?的详细内容,更多关于web调用api接口实例的资料请关注脚本之家其它相关文章!

免责声明:本文只为提供市场讯息,所有内容及观点仅供参考,不构成投资建议,不代表本站观点和立场。投资者应自行决策与交易,对投资者交易形成的直接或间接损失,作者及本站将不承担任何责任。!
Tag:Web   API  

你可能感兴趣的文章

币圈快讯

  • Hyperliquid平台鲸鱼当前持仓42.01亿美元多空持仓比为0.99

    2026-06-13 21:00
    据Coinglass数据,Hyperliquid平台鲸鱼当前持仓42.01亿美元,多单持仓20.92亿美元,持仓占比49.79%,空单持仓21.1亿美元,持仓占比50.21%。多单盈亏-1.56亿美元,空单盈亏8,824.4万美元。 其中,巨鲸地址0x0ddf..02在1810.16美元价格3倍全仓做空ETH,目前未实现盈亏780.38万美元。
  • 下周宏观展望:沃什“首秀”在即美联储将公布利率决议

    2026-06-13 20:41
    下周,市场焦点将集中在美联储等多家主要央行的利率决议上,沃什自宣誓就任美联储新任主席后一直保持沉默,6月利率决议公布后的新闻发布会将是其货币政策立场的关键验证。市场同样期待他届时就沟通机制改革发出明确信号。以下是新的一周里市场将重点关注的要点(均为北京时间): 周一15:15,欧洲央行行长拉加德发表讲话; 周二待定,日本央行公布利率决议;14:30,日本央行副行长内田真一召开货币政策新闻发布会; 周二20:15,美国至5月30日当周ADP就业人数周度变动; 周四2:00,美联储FOMC公布利率决议和经济预期摘要;2:30,美联储主席沃什召开货币政策新闻发布会; 周四20:30,美国至6月13日当周初请失业金人数、美国6月费城联储制造业指数。 在政策信号方面,市场聚焦美联储三个鹰派信号是否落地:首先是原政策声明中“下一步倾向降息”的表述会否被删除。若删除该措辞,意味着美联储正式结束此前的宽松倾向,转向以抗通胀为核心的政策基调。其次是点阵图的变动,3月点阵图显示年内尚有一次降息,但本次点阵图大概率转向显示利率稳定,甚至可能出现多数官员预期加息的情况。最后是风险偏好倾斜。若官员们对通胀的担忧明显升温、对劳动力市场的忧虑消退,则可能为后续加息铺路。周五(6月19日),因六月节,美国纽交所休市一天,芝商所旗下贵金属、能源、外汇、股指、美债期货合约交易提前于北京时间20日01:00结束,洲际交易平台旗下布伦特原油期货合约交易提前于北京时间20日01:30结束。
  • 若比特币突破6.6万美元主流CEX累计空单清算强度将达9.15亿

    2026-06-13 20:40
    据Coinglass数据,若比特币突破6.6万美元,主流CEX累计空单清算强度将达9.15亿。反之,若比特币跌破6.2万美元,主流CEX累计多单清算强度将达9亿。清算图并不是展示精确的待清算的合约数目,或者精确的被清算的合约价值。清算图上的柱子展示的是其实是每个清算簇相对临近清算簇的重要性,即强度。因此,清算图展现的是标的价格达到某个位置会被影响到什么程度。更高的“清算柱”表示价格到了之后将会因为流动性浪潮产生更加强烈的反应。
  • 萨尔瓦多优化移民制度临时居民比特币收益与海外收入享0%税率

    2026-06-13 20:06
    萨尔瓦多正在持续优化其移民制度,以吸引高净值外国人才与资本(包括家庭)。根据2026年3月31日生效的第531号法令,临时居民的居住要求已从每年必须在境内停留9个月,降低至每年累计或连续仅需居住90天。这一调整主要面向需要频繁跨境流动的企业家、投资者以及远程工作者。萨尔瓦多为拥有海外来源收入的个人提供了拉美地区最具吸引力的税制之一。该国实行属地税制,意味着只有在萨尔瓦多境内产生的收入才需要纳税。2024年的一项重要所得税改革进一步明确:无论居民还是非居民,其海外来源收入均可免征所得税。这意味着自由职业者、远程工作者(如内容创作者、开发者以及海外收入的企业家)可以对其境外收入享受0%萨尔瓦多所得税,且不受金额限制。此外,根据该国法律,比特币相关资本利得不征税,同时该国也不征收财富税、遗产税或赠与税。真正的焦点在于个人原属国是否承认这一安排;因为大多数国家通常不会轻易放弃对其税收居民的征税权,往往会在税务归属问题上进行严格审查与追索。
  • 数据美国现货比特币ETF单日净流入近8600万美元

    2026-06-13 20:01
    SoSoValue数据显示,上周五美国现货比特币ETF合计净流入近8600万美元,约合1350枚比特币,其中BlackRock旗下IBIT净流入近5800万美元。StandardChartered全球加密研究主管GeoffreyKendrick表示,近期ETF抛售可能与部分持有人为参与SpaceXIPO释放现金有关。美国现货比特币ETF自去年10月以来累计净流出76亿美元,其中2026年前六个月净流出30亿美元。Strategy为全球最大企业比特币持有者,持有逾80万枚比特币。MichaelSaylor在6月初恢复买入比特币,此前Strategy于5月底进行过出售。
  • 查看更多
更多

热门币种

  • 币种
    最新价格
    24H涨跌幅
  • bitcoin BTC 比特币

    BTC

    比特币

    $ 63962.99¥ 432652.06
    +0.25%
  • ethereum ETH 以太坊

    ETH

    以太坊

    $ 1678.2¥ 11351.51
    +0.23%
  • tether USDT 泰达币

    USDT

    泰达币

    $ 0.9994¥ 6.76
    +0.06%
  • binance-coin BNB 币安币

    BNB

    币安币

    $ 606.51¥ 4102.49
    -0.11%
  • usdc USDC USD Coin

    USDC

    USD Coin

    $ 1.0003¥ 6.7661
    -0.05%
  • ripple XRP 瑞波币

    XRP

    瑞波币

    $ 1.1481¥ 7.7658
    +0.55%
  • solana SOL Solana

    SOL

    Solana

    $ 67.7579¥ 458.32
    +1.26%
  • tron TRX 波场

    TRX

    波场

    $ 0.3168¥ 2.1428
    +1.44%
  • dogecoin DOGE 狗狗币

    DOGE

    狗狗币

    $ 0.087953¥ 0.5949
    +1.1%
  • hyperliquid HYPE Hyperliquid

    HYPE

    Hyperliquid

    $ 58.6832¥ 396.93
    -1.11%