記錄--get請求參數放在body中?

来源:https://www.cnblogs.com/smileZAZ/archive/2023/12/20/17917253.html
-Advertisement-
Play Games

這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 1、背景 與後端對介面時,看到有一個get請求的介面,它的參數是放在body中的 ******get請求參數可以放在body中?? 隨即問了後端,後端大哥說在postman上是可以的,還給我看了截圖 可我傳參怎麼也調不通! 下麵就來探究到 ...


這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

 

1、背景

與後端對介面時,看到有一個get請求的介面,它的參數是放在body中的

******get請求參數可以放在body中??

隨即問了後端,後端大哥說在postman上是可以的,還給我看了截圖

 

可我傳參怎麼也調不通!

下麵就來探究到底是怎麼回事

2、能否發送帶有body參數的get請求

項目中使用axios來進行http請求,使用get請求傳參的基本姿勢:

// 參數拼接在url上
axios.get(url, {
  params: {}
})

如果想要將參數放在body中,應該怎麼做呢?

查看axios的文檔並沒有看到對應說明,去github上翻看下axios源碼看看

lib/core/Axios.js文件中

 可以看到像deletegetheadoptions方法,它們只接收兩個參數,不過在config中有一個data

熟悉的post請求,它接收的第二個參數data就是放在body的,然後一起作為給this.request作為參數

所以看樣子get請求應該可以在第二個參數添加data屬性,它會等同於post請求的data參數

順著源碼,再看看lib/adapters/xhr.js,上面的this.request最終會調用這個文件封裝的XMLHttpRequest

export default isXHRAdapterSupported && function (config) {
  return new Promise(function dispatchXhrRequest(resolve, reject) {
    let requestData = config.data

    // 將config.params拼接在url上
    request.open(config.method.toUpperCase(), 
                 buildURL(fullPath, config.params, config.paramsSerializer), true);
    
    // 省略若幹代碼
    ...

    // Send the request
    request.send(requestData || null);
  });
}

最終會將data數據發送出去

所以只要我們傳遞了data數據,其實axios會將其放在body發送出去的

2.1 實戰

本地起一個koa服務,弄一個簡單的介面,看看後端能否接收到get請求的body參數

router.get('/api/json', async (ctx, next) => {
	console.log('get請求獲取body: ', ctx.request.body)
  
	ctx.body = ctx.request.body
})

router.post('/api/json', async (ctx, next) => {
	console.log('post請求獲取body: ', ctx.request.body)

	ctx.body = ctx.request.body
})

為了更好地比較,分別弄了一個getpost介面

前端調用介面:

const res = await axios.get('/api/json', {
  data: {
    id: 1,
    type: 'GET'
  }
})


const res = await axios.post('/api/json', {
  data: {
    id: 2,
    type: 'POST'
  }
})
console.log('res--> ', res)

axiossend處打一個斷點

可以看到數據已經被放到body中了

後端已經接收到請求了,但是get請求無法獲取到body

結論:

  • 前端可以發送帶body參數的get請求,但是後端接收不到
  • 這就是介面一直調不通的原因

3、這是為何呢?

我們查看WHATGW標準,在XMLHttpRequest中有這麼一個說明:

大概意思:如果請求方法是GETHEAD ,那麼body會被忽略的

所以我們雖然傳遞了,但是會被瀏覽器給忽略掉

這也是為什麼使用postman可以正常請求,但是前端調不通的原因了

因為postman並沒有遵循WHATWG的標準,body參數沒有被忽略

3.1 fetch是否可以?

fetch.spec.whatwg.org/#request-cl…

答案:也不可以,fetch會直接報錯

總結

  1. 結論:瀏覽器並不支持get請求將參數放在body
  2. XMLHTTPRequest會忽略body參數,而fetch則會直接報錯

本文轉載於:

https://juejin.cn/post/7283367128195055651

如果對您有所幫助,歡迎您點個關註,我會定時更新技術文檔,大家一起討論學習,一起進步。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 問題 在調試接收串口數據的Qt程式中發現,數據存在延遲和粘包現象。下位機發送數據包頻率是100Hz,一包56位元組,波特率115200,在列印port->readAll()的值的時候發現並不是每10ms讀到一包數據,而是大概每50ms左右一次接收到5包數據,在其他電腦上調試,以及下載其他串口助手調試後 ...
  • Flink中的處理函數(ProcessFunction和KeyedProcessFunction)在對於數據進行顆粒化的精確計算時使用較多,處理函數提供了一個定時服務(TimerService),可以向未來註冊一個定時服務, ...
  • 一、按照月分片 使用場景為按照自然月來分片,每個自然月為一個分片,但是一年有12個月,是不是要有12個數據節點才行呢?並不是。例如我現在只有三個分片資料庫,這樣就可以1月在第一個數據分片中,2月在第二個數據分片中,3月在第三個數據分片中,當來到4月的時候,就會重新開始分片,4月在第一個數據分片,5月 ...
  • 1. 基礎知識回顧 1、索引的有序性,索引本身就是有序的 2、InnoDB中間隙鎖的唯一目的是防止其他事務插入間隙。間隙鎖可以共存。一個事務取得的間隙鎖並不會阻止另一個事務取得同一間隙上的間隙鎖。共用和獨占間隔鎖之間沒有區別。它們彼此之間不衝突,並且執行相同的功能。 3、MySQL預設隔離級別是 R ...
  • 芋道源碼相信很多朋友都很瞭解了,今天我們試著基於FastGPT實現芋道框架的代碼生成。芋道的代碼生成,是基於資料庫表欄位實現的,那我們的思路就是看看如何使用GPT幫我們生成資料庫表結構,只要資料庫表欄位有了,代碼也就生成好了。實現這個需求我們就需要用到FastGPT的高級編排功能。編排的整體思路如下 ...
  • 在之前三期的實時湖倉系列文章中,我們從業務側、產品側、應用側等幾個方向,為大家介紹了實時湖倉方方面面的內容,包括實時湖倉對於企業數字化佈局的重要性以及如何進行實時湖倉的落地實踐等。 本文將從純技術的角度,為大家解析實時湖倉的存儲原理以及生態選型,為企業建設實時湖倉給出技術方面的參考意見。 實時湖倉能 ...
  • 關於GreatSQL字元集的總結 前言 最近的SQL優化工作中經常遇到因字元集或校驗規則不一致導致索引使用不了的問題,修改表的字元集或校驗規則相當於把表重構,表中數據量大時,處理起來費時費力,希望應用開發者在設計之初時註意到此問題,讓後期接手運維的小伙伴少一些負擔。GreatSQL的字元集和校驗規則 ...
  • create database step2; go use step2; go ​ -- 學生表 create table StudentInfo ( stuId char(10) primary key, -- 主鍵 stuName varchar(20), -- 姓名 ClassId int, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...