最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

當(dāng)前位置:主頁 > 區(qū)塊鏈 > 區(qū)塊鏈技術(shù) > web調(diào)用api接口實(shí)例

如何實(shí)現(xiàn)在純Web端完成各類API調(diào)試?

2023-06-02 15:43:56 | 來源:CSDN | 作者:張濤
這篇文章主要介紹了如何實(shí)現(xiàn)在純Web端完成各類API調(diào)試?的相關(guān)資料,需要的朋友可以參考下本文詳細(xì)內(nèi)容介紹

在軟件開發(fā)過程中,對于各類 API 的調(diào)試工作至關(guān)重要。API 調(diào)試是驗(yàn)證和測試應(yīng)用程序接口的有效性和正確性的關(guān)鍵步驟。傳統(tǒng)的 API 調(diào)試方法通常依賴于獨(dú)立的工具或桌面應(yīng)用程序,限制了調(diào)試過程的靈活性和效率。

為推動 API 調(diào)試向更便捷、高效的方向發(fā)展,越來越多的開發(fā)人員開始尋求在純 Web 端完成各類 API 調(diào)試的解決方案。純 Web 端的 API 調(diào)試具有許多優(yōu)勢,包括無需安裝額外軟件、跨平臺支持、便于團(tuán)隊(duì)協(xié)作等。本文將以開源項(xiàng)目 AREX 為例為大家介紹如何在 Web 端實(shí)現(xiàn)對各類 API 的調(diào)試功能。

AREX (http://arextest.com/)是一款開源的基于真實(shí)請求與數(shù)據(jù)的自動化回歸測試平臺,利用 Java Agent 技術(shù)與比對技術(shù),通過流量錄制回放能力實(shí)現(xiàn)快速有效的回歸測試。同時提供了接口測試、接口比對測試等豐富的自動化測試功能。

難點(diǎn)一:跨域限制

要想在純 Web 端實(shí)現(xiàn)各類 API 的調(diào)試工作,首先要解決的難題是處理瀏覽器的跨域限制。

什么是跨域

瀏覽器跨域問題是指在 Web 開發(fā)中,當(dāng)使用 JavaScript 代碼從一個域名的網(wǎng)頁訪問另一個域名的資源時會遇到的限制。瀏覽器實(shí)施了一種安全策略,稱為同源策略(Same-Origin Policy), 用于保護(hù)用戶信息的安全。同源策略要求網(wǎng)頁中的 JavaScript 只能訪問與其來源(協(xié)議、域名和端口號)相同的資源,而對于不同域名的資源訪問會受到限制。

由于瀏覽器存在跨域限制,我們不能在瀏覽器端隨心所欲地發(fā)送 HTTP 請求,這是瀏覽器的安全策略決定的。

解決方案

經(jīng)調(diào)研,突破此限制的方法有兩種:分別是 Chrome 插件代理和服務(wù)端代理,以下是兩種方法的比較。

權(quán)衡下來 AREX 選擇了 Chrome 插件代理的方法,其原理是利用了 Chrome 插件中 background 可以發(fā)送跨域請求的能力,我們將瀏覽器端攔截到的請求通過 window.postmassage 與 Chrome 插件的 background 進(jìn)行通信(其中通信還需要 Chrome 插件的 content-script 作為數(shù)據(jù)橋梁)。

具體實(shí)現(xiàn)如下:

在頁面腳本中

生成一個隨機(jī)的字符串,并將其轉(zhuǎn)換為字符串形式,存儲在 tid 變量中。

使用 window.postMessage() 方法發(fā)送一條消息到其他擴(kuò)展程序,消息包括一個類型為 `AREX_EXTENSION_REQUEST` 的標(biāo)識、tid、以及 params 參數(shù)。

添加一個 message 事件監(jiān)聽器 receiveMessage,用于接收其他擴(kuò)展程序發(fā)送的消息。

在 receiveMessage 函數(shù)中,檢查接收到的消息是否為類型為 AREX_EXTENSION_RES,并且 tid 與之前發(fā)送的消息的tid 相匹配。如果匹配成功,則移除事件監(jiān)聽器。

在內(nèi)容腳本中

在后臺腳本中

難點(diǎn)二:API 調(diào)試

上述已經(jīng)解決了跨域問題,接下來就是如何實(shí)現(xiàn) API 調(diào)試的功能。

解決方案

Postman 是業(yè)內(nèi)成熟的 API 調(diào)試工具,我們站在了 Postman 這位巨人的肩膀上,在 AREX 中引入了 Postman 的 JavaScript 沙盒,使用它的沙盒運(yùn)行前置腳本、后置腳本以及斷言來調(diào)試 API。

以下是 AREX 請求的流程圖:

當(dāng)點(diǎn)擊發(fā)送請求的時候,會將表單中的數(shù)據(jù)匯聚到一起,數(shù)據(jù)結(jié)構(gòu)為:

這是 AREX 的數(shù)據(jù)結(jié)構(gòu),我們會將其轉(zhuǎn)換成 Postman 的數(shù)據(jù)結(jié)構(gòu)。之后調(diào)用 PostmanRuntime.Runner() 方法,將轉(zhuǎn)換好了的 Postman 數(shù)據(jù)結(jié)構(gòu)和當(dāng)前所選的環(huán)境變量傳入,Runner 會執(zhí)行 preRequestScript 和 testScript 腳本。`preRequestScript` 發(fā)生在請求之前,可以在其中穿插請求以及對請求參數(shù)、環(huán)境變量進(jìn)行操作,`testScript` 發(fā)生在請求之后,可以對 response 返回數(shù)據(jù)進(jìn)行斷言操作,并且腳本中也可以通過 `console.log` 輸出數(shù)據(jù),在控制臺進(jìn)行調(diào)試。

在 Postman 沙盒中也存在跨域問題,由于 Postman 沙盒的集成度非常高,為了確保與 PostmanRuntime 的同步以及方便性,我們采用了 Ajax 攔截技術(shù)。通過在瀏覽器端攔截 Ajax 請求,我們可以對請求進(jìn)行修改、添加自定義邏輯或者進(jìn)行其他處理操作。這樣可以實(shí)現(xiàn)對請求和響應(yīng)的全局控制和定制化。

當(dāng) Postman 沙盒發(fā)送請求時,會攜帶一個名為 "postman-token" 的請求頭。我們攔截到這個 Ajax 請求后,會將請求參數(shù)進(jìn)行拼裝,并通過 window.postMessage 發(fā)送給瀏覽器插件。瀏覽器插件再次構(gòu)建 fetch 請求,將數(shù)據(jù)返回給 Postman 沙盒,使其輸出最終結(jié)果,包括響應(yīng)(response)、測試結(jié)果(testResult)和控制臺日志(console.log)。需要注意的是,responseType 必須指定為 arraybuffer。

具體流程如下:

使用 xspy.onRequest() 方法注冊一個請求處理程序。這個處理程序接受兩個參數(shù):request 和 sendResponse。request 參數(shù)包含請求的相關(guān)信息,例如方法、URL、頭部、請求體等。sendResponse 是一個回調(diào)函數(shù),用于發(fā)送響應(yīng)給請求方。

在處理程序中,通過檢查請求的頭部中是否存在 postman-token 來判斷請求是否來自 Postman。

如果存在該頭部,表示請求是通過 Postman 發(fā)送的。則使用 AgentAxios 發(fā)起一個新的請求,使用原始請求的方法、URL、頭部和請求體。AgentAxios 返回一個 agentData 對象,其中包含了響應(yīng)的狀態(tài)碼、頭部和數(shù)據(jù)等信息。創(chuàng)建一個名為 dummyResponse 的響應(yīng)對象,包含了與原始請求相關(guān)的信息。dummyResponse 的 status 字段為 agentData 的狀態(tài)碼,headers 字段為將 agentData 的頭部數(shù)組轉(zhuǎn)換為對象格式的結(jié)果,ajaxType 字段為字符串 xhr,responseType 字段為字符串 arraybuffer,response 字段為將 agentData 的數(shù)據(jù)轉(zhuǎn)換為 JSON 字符串并用 Buffer 包裝的結(jié)果。最后,使用 sendResponse(dummyResponse) 將響應(yīng)發(fā)送給請求方。

如果請求不是來自 Postman,則直接調(diào)用 sendResponse(),表示不返回任何響應(yīng)。

難點(diǎn)三:二進(jìn)制對象序列化傳遞

還有一點(diǎn)值得一提,對于 `x-www-form-urlencoded` 和 `Raw` 類型的請求,由于它們都是普通的 JSON 對象,處理起來比較容易。但是對于 `form-data` 和 `binary` 類型的請求,需要支持傳輸二進(jìn)制文件負(fù)載。然而,Chrome 插件的 `postMessage` 通信方式不支持直接傳遞二進(jìn)制對象,導(dǎo)致無法直接處理這兩種類型的請求。

解決方案

為了解決這個問題,AREX 采用了 base64 編碼技術(shù)。在用戶選擇文件時,AREX 會將二進(jìn)制文件轉(zhuǎn)換為 base64 字符串,然后進(jìn)行傳輸。在 Chrome 插件端,AREX 會將 base64 數(shù)據(jù)進(jìn)行解碼,并用于構(gòu)建實(shí)際的 `fetch` 請求。這樣可以繞過直接傳遞二進(jìn)制對象的限制。

就這個問題我們采用了 base64 編碼技術(shù),在選擇文件時我們會將二進(jìn)制文件轉(zhuǎn)換成 base64 字符串,再進(jìn)行傳輸,Chrome 插件端會將 base64 數(shù)據(jù)解碼并用于構(gòu)建實(shí)際的 `fetch` 請求。

這個流程圖描述了將 FormData 中的二進(jìn)制文件轉(zhuǎn)換為 Base64 字符串,并通過 Chrome 插件代理將其轉(zhuǎn)換回文件并進(jìn)行進(jìn)一步處理的過程。

form-data binary(A):表示一個包含二進(jìn)制文件的 FormData 表單數(shù)據(jù)。

FileReader(B):使用 FileReader 對象來讀取二進(jìn)制文件。

readAsDataURL base64 string:FileReader 使用 readAsDataURL 方法將二進(jìn)制文件讀取為 Base64 字符串。

Chrome 插件代理(C):Base64 字符串經(jīng)過讀取操作后,傳遞給 Chrome 插件代理進(jìn)行進(jìn)一步處理。

base64 string:表示經(jīng)過 FileReader 讀取二進(jìn)制文件后得到的 Base64 字符串。

Uint8Array(D):在 Chrome 插件代理中,將 Base64 字符串轉(zhuǎn)換為 Uint8Array。

File(E):使用 Uint8Array 的數(shù)據(jù)創(chuàng)建一個新的 File 對象。

fetch(F):將新創(chuàng)建的 File 對象通過 fetch 方法或其他方式進(jìn)行進(jìn)一步處理,例如上傳到服務(wù)器或進(jìn)行其他操作。

代碼分析

以下是代碼層面的分析:

toBase64 函數(shù)接受一個 File 對象作為參數(shù),并返回一個 Promise 對象,該 Promise 對象將解析為表示文件的 Base64 字符串。

在函數(shù)內(nèi)部,創(chuàng)建了一個 FileReader 對象。通過調(diào)用 reader.readAsDataURL(file) 將文件讀取為 Data URL。當(dāng)讀取操作完成時,通過 reader.onload 事件處理程序?qū)⒆x取結(jié)果解析為字符串,并使用 resolve 將其傳遞給 Promise。如果發(fā)生錯誤,將使用 reject 將錯誤傳遞給 Promise。base64ToFile 函數(shù)接受兩個參數(shù):dataurl(Base64 字符串)和 filename(文件名),并返回一個 File 對象。

首先,將 dataurl 使用逗號分割成數(shù)組 arr,如果分割結(jié)果為空,則將其設(shè)為包含一個空字符串的數(shù)組。通過正則表達(dá)式匹配 arr[0] 中的內(nèi)容,提取出 MIME 類型,即數(shù)據(jù)的類型。

使用 atob 將 Base64 字符串解碼為二進(jìn)制字符串 bstr。創(chuàng)建一個長度為 n 的 Uint8Array 數(shù)組 u8arr。使用循環(huán)遍歷 bstr,將每個字符的 Unicode 編碼放入 u8arr 中。

最后,使用 File 構(gòu)造函數(shù)創(chuàng)建并返回一個新的 File 對象,其中包含了從 u8arr 中讀取的文件數(shù)據(jù)、文件名和 MIME 類型。導(dǎo)出 base64ToFile 函數(shù),以便在其他地方使用。

以上就是如何實(shí)現(xiàn)在純Web端完成各類API調(diào)試?的詳細(xì)內(nèi)容,更多關(guān)于web調(diào)用api接口實(shí)例的資料請關(guān)注腳本之家其它相關(guān)文章!

免責(zé)聲明:本文只為提供市場訊息,所有內(nèi)容及觀點(diǎn)僅供參考,不構(gòu)成投資建議,不代表本站觀點(diǎn)和立場。投資者應(yīng)自行決策與交易,對投資者交易形成的直接或間接損失,作者及本站將不承擔(dān)任何責(zé)任。!
Tag:Web   API  

你可能感興趣的文章

幣圈快訊

  • SK海力士Q2利潤或創(chuàng)紀(jì)錄韓國存儲雙雄合計利潤有望破150萬億韓元

    2026-07-26 12:07
    SK海力士將于29日公布第二季度業(yè)績,繼三星電子之后,預(yù)計SK海力士今年第二季度盈利也將創(chuàng)下新高。 根據(jù)韓國金融信息機(jī)構(gòu)YonhapInfomax匯總的14家券商過去一個月發(fā)布的報告,SK海力士第二季度營收和營業(yè)利潤預(yù)計分別為84.0597萬億韓元和64.0899萬億韓元。第二季度營業(yè)利潤預(yù)期比去年全年47.2萬億韓元的營業(yè)利潤高出約17萬億韓元。 加上今年第一季度37.6103萬億韓元的營業(yè)利潤,SK海力士僅上半年的營業(yè)利潤就將超過100萬億韓元。本月早些時候,三星電子也發(fā)布了初步業(yè)績報告,其DS部門表現(xiàn)強(qiáng)勁,營業(yè)利潤達(dá)到89.4萬億韓元。如果SK海力士的業(yè)績符合市場預(yù)期,兩家公司第二季度的合并營業(yè)利潤將超過150萬億韓元。
  • 若ETH跌破1788美元主流CEX累計多單清算強(qiáng)度將達(dá)4.48億美元

    2026-07-26 12:00
    據(jù)Coinglass數(shù)據(jù)顯示,若ETH跌破1,788美元,主流CEX累計多單清算強(qiáng)度將達(dá)4.48億美元。反之,若ETH突破1,960美元,主流CEX累計空單清算強(qiáng)度將達(dá)3.7億美元。
  • CathieWood:特斯拉和SpaceX是其最看好的AI股票

    2026-07-26 11:55
    7月26日,ARKInvest創(chuàng)始人CathieWood在采訪中表示,特斯拉(TSLA)和SpaceX(SPCX)是其最看好的AI股票,認(rèn)為投資者低估了兩家公司在Robotaxi、Optimus人形機(jī)器人、前沿AI模型以及軌道數(shù)據(jù)中心等領(lǐng)域的業(yè)務(wù)機(jī)會。她表示,這些領(lǐng)域均存在“數(shù)萬億美元規(guī)模的機(jī)會”。
  • 8月1日SUI將解鎖價值976萬美元代幣

    2026-07-26 11:42
    7月26日,OnchainLens在X平臺發(fā)文表示,SUI較約1年前創(chuàng)下的歷史高點(diǎn)下跌82.8%,8月1日將解鎖價值976萬美元的代幣。共1372萬枚SUI將釋放,其中早期貢獻(xiàn)者765萬枚,社區(qū)儲備400萬枚,MystenLabsTreasury207萬枚。過去30天,四次單獨(dú)事件中已解鎖2260萬枚代幣,約1610萬美元。其總歸屬計劃已完成40.6%。最大分配桶為Others52.2%、Community26.0%、PrivateInvestors14.1%。當(dāng)前價格為0.7136美元。
  • 10家上市公司合計持有超100萬枚BTCStrategy持倉價值約580億美元

    2026-07-26 11:34
    截至2026年7月25日,10家上市公司合計持有超100萬枚BTC。Strategy持有843,775枚BTC,按當(dāng)前價格計算價值約580億美元,仍為全球最大企業(yè)比特幣持有者。榜單中,TwentyOneCapital持有43,514枚BTC,Metaplanet持有43,000枚BTC,MaraHoldings持有36,303枚BTC,Bullish持有24,300枚BTC,Strive持有19,921枚BTC。SpaceX持有18,712枚BTC,CoinbaseGlobal持有16,492枚BTC,RiotPlatforms持有15,680枚BTC,Cleanspark持有13,924枚BTC。SpaceX于2026年6月12日在納斯達(dá)克上市,IPO募資約857億美元。2026年以來,RiotPlatforms股價上漲73%,Cleanspark上漲39%,MaraHoldings上漲31%。同期Strategy下跌40%,Metaplanet下跌49%,TwentyOneCapital下跌48%,CoinbaseGlobal下跌31%。
  • 查看更多
更多

熱門幣種

  • 幣種
    最新價格
    24H漲跌幅
  • bitcoin BTC 比特幣

    BTC

    比特幣

    $ 64552.37¥ 437032.45
    +0.73%
  • ethereum ETH 以太坊

    ETH

    以太坊

    $ 1882.14¥ 12742.46
    +1.26%
  • tether USDT 泰達(dá)幣

    USDT

    泰達(dá)幣

    $ 0.999¥ 6.7634
    +0%
  • binance-coin BNB 幣安幣

    BNB

    幣安幣

    $ 570.38¥ 3861.58
    +0.88%
  • usdc USDC USD Coin

    USDC

    USD Coin

    $ 1.0008¥ 6.7756
    +0%
  • ripple XRP 瑞波幣

    XRP

    瑞波幣

    $ 1.1013¥ 7.456
    +0.82%
  • solana SOL Solana

    SOL

    Solana

    $ 75.0016¥ 507.77
    +1.17%
  • tron TRX 波場

    TRX

    波場

    $ 0.3312¥ 2.2422
    +0.33%
  • hyperliquid HYPE Hyperliquid

    HYPE

    Hyperliquid

    $ 58.6049¥ 396.76
    +1.99%
  • dogecoin DOGE 狗狗幣

    DOGE

    狗狗幣

    $ 0.072782¥ 0.4927
    +4.39%
廉江市| 高州市| 察雅县| 白河县| 扬中市| 江门市| 武冈市| 汶上县| 徐汇区| 尉氏县| 商河县| 务川| 阳高县| 澄江县| 平塘县| 泗水县| 咸阳市| 宣恩县| 望奎县| 许昌市| 呼图壁县| 太仓市| 无锡市| 阳朔县| 闸北区| 德阳市| 惠东县| 铜梁县| 门头沟区| 县级市| 渝北区| 柳河县| 封开县| 澎湖县| 陇南市| 肇州县| 苏尼特左旗| 通州市| 唐海县| 庄河市| 汉中市|