axios 發 post 請求,后端接收不到參數的解決方案

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

問題場景
場景很簡單,就是一個正常 axios post 請求:

axios({headers: {'deviceCode': 'A95ZEF1-47B5-AC90BF3'},method: 'post',url: '/api/lockServer/search',data: {username,pwd}
})


后臺說沒有接收到你的傳參。

這就有點奇怪了,我看了一下瀏覽器的請求信息是 OK 的,參數都是有的,而且之前這樣用 axios 也沒有這個問題。

但是這個接口是通用的,別人都用了,是 OK 的,接口沒問題。

問題原因
要點1
原因就是這次的接口使用 java spring mvc
并且在這個方法上使用了注解 @RequestParam

那么這個是什么意思呢,這個是只能從請求的地址中取出參數,也就是只能從 username=admin&password=admin 這種字符串中解析出參數。

要點2
我們還可以看到我們這次請求的 Content-Type:

application/json;charset=UTF-8
1
關于這一點需要說明的是:

1、axios會幫我們 轉換請求數據和響應數據 以及 自動轉換 JSON 數據


2、在 axios 源碼中發現下面這段內容:(很關鍵)

我們知道在做 post 請求的時候,我們的傳參是 data: {...} 或者直接 {...} 的形式傳遞的,嗯,就是下面這兩種形式

【第一種形式】


【第二種形式】


非常的刺激,這兩種形式無一例外都觸發了 axios 源碼中【很關鍵】的那一段代碼

問題分析
也就是說,我們的 Content-Type 變成了 application/json;charset=utf-8
然后,因為我們的參數是 JSON 對象,axios 幫我們做了一個 stringify 的處理。
而且查閱 axios 文檔可以知道:axios 使用 post 發送數據時,默認是直接把 json 放到請求體中提交到后端的。

那么,這就與我們服務端要求的 'Content-Type': 'application/x-www-form-urlencoded' 以及 @RequestParam 不符合。

解決方案
解決方案一
【用 URLSearchParams 傳遞參數】

let param = new URLSearchParams()
param.append('username', 'admin')
param.append('pwd', 'admin')
axios({method: 'post',url: '/api/lockServer/search',data: param
})

需要注意的是: URLSearchParams 不支持所有的瀏覽器,但是總體的支持情況還是 OK 的,所以優先推薦這種簡單直接的解決方案

解決方案二
網上有很多方案說使用
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
或者
{headers:{'Content-Type':'application/x-www-form-urlencoded'}}
我試了一下,其實這樣還是不行的
【還需要額外的操作,(我們要將參數轉換為query參數)】
引入 qs ,這個庫是 axios 里面包含的,不需要再下載了。

import Qs from 'qs'
let data = {"username": "admin","pwd": "admin"
}axios({headers: {'deviceCode': 'A95ZEF1-47B5-AC90BF3'},method: 'post',url: '/api/lockServer/search',data: Qs.stringify(data)
})

解決方案三
既然 axios 源碼中有那么一段【很關鍵】的代碼,那么,我們也可以通過修改 transformRequest 來達到我們的目的。

在 axios 的請求配置項中,是有 transformRequest 的配置的:

OK,那么現在我們的請求就可以寫成下面這個樣子了:

import Qs from 'qs'
axios({url: '/api/lockServer/search',method: 'post',transformRequest: [function (data) {// 對 data 進行任意轉換處理return Qs.stringify(data)}],headers: {'deviceCode': 'A95ZEF1-47B5-AC90BF3'},data: {username: 'admin',pwd: 'admin'}
})

解決方案四
【重寫一個 axios 實例,重新實現屬于我們自己的 transformRequest】

import axios from 'axios'
let instance = axios.create({transformRequest: [function transformRequest(data, headers) {normalizeHeaderName(headers, 'Content-Type');if (utils.isFormData(data) ||utils.isArrayBuffer(data) ||utils.isBuffer(data) ||utils.isStream(data) ||utils.isFile(data) ||utils.isBlob(data)) {return data;}if (utils.isArrayBufferView(data)) {return data.buffer;}if (utils.isURLSearchParams(data)) {setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');return data.toString();}/*改了這里*/if (utils.isObject(data)) {setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');let _data = Object.keys(data)return encodeURI(_data.map(name => `${name}=${data[name]}`).join('&'));}return data;}],
})

解決方案五

axios.post('/api/lockServer/search',"userName='admin'&pwd='admin'");

解決方案六
我們知道現在我們服務端同學接收參數用的是 @RequestParam(通過字符串中解析出參數)
其實還有另一種是 @RequestBody(從請求體中獲取參數)。

我們讓后端的同學改成 @RequestBody 不就可以了嗎
---------------------?

轉自:https://blog.csdn.net/csdn_yudong/article/details/79668655?
?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447985.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447985.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447985.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

nginx+keepalived高可用性負載均衡

一、前言nginx進程基于于MasterSlave(worker)多進程模型,自 身具有非常穩定的子進程管理功能。在Master進程分配模式下,Master進程永遠不進行業務處理,只是進行任務分發,從而達到Master進程的存 活高可靠性,Slave(work…

白發變黑有訣竅

白發變黑發的有效方法 1、要遠離焦慮: 如果天天的憂愁、煩惱、焦慮,則可能引起脫發,焦慮壓抑的時間越長,脫發就會迅速的加快。不管工作如何忙碌,建議女性保持適當的運動量以及愉快的心情,頭發也會富有光…

經典監督學習方法

生成算法嘗試去找這個數據到底是怎么生成的(產生的),然后再對一個信號進行分類。基于你的生成假設,哪個類別最有可能產生這個信號,這個信號就屬于那個類別。 判別模型不關心數據是怎么生成的,它只關心信號之…

Map 集合循環、遍歷的 四 種方式

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 package cn.jdbc.test; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry;/…

Ubuntu版本更新一路走來:朕就是這樣的漢子

今日,Ubuntu發布了最新的14.04版本。當然,業界對新版Ubuntu褒貶不一,為此我們回顧了Ubuntu版本更新歷史上幾個比較有代表性的版本,看看Ubuntu這一路走來究竟有什么變化。Ubuntu剛剛發布了最新的14.04版本,圍繞這一版本…

「2019紀中集訓Day7」解題報告

T1、小L的數列 給一個數列 \(\{f_i\}\):\[ f_i \prod_{j 1}^{j \leq k} f_{i - j}^{b_j}, \ (i > k) \] 現在給定數列的前 \(k \ (k \le 200)\) 項及 \({b_i}\),求第 \(n\) 項。 \(Sol\): 注意到數列的任意一項 \(f_i \ (i > k)\)&am…

我想擁有一座莊園:“ 暮春三月,江南草長,雜花生樹,群鶯亂飛 ... ”

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 // 或許這個心愿是緣于少時讀的詩:其中大多是對于自然的期許和神往 ... // 亦或許是想太多的人大多都有這樣的心愿 ... 我想…

安裝Ubuntu 14.04后要做的5件事情

Ubuntu最新版本Ubuntu 14.04已經發布,它是一個長期支持版本(LTS),提供軟件包和安全更新的服務周期為5年。本文為大家簡單介紹了Ubuntu 14.04版本新特性和安裝Ubuntu 14.04后需要做的5件事情,以供參考。Ubuntu目前是世界…

昨天,我的大學學習[2]

昨天,我的大學學習[2] 曾毅 誰能改變我的命運[大學二年級] 如果說大學一年級的時候是一種被動學習狀態,對計算機科學不能攬其全貌,那么進入大學二年級以后的學習便是比較有針對性的了,但這種轉變并非偶然,同樣也是經過…

VUE 項目 去除 input 框值 所有空格、vue 組件去除空格、input 去除空格

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1.以下所有方法 我都試過:不行。 str.trim(); //去掉首尾空格 str.replace(" ",""); //去除所有空格&…

性能優化之節流、防抖

1. 防抖: 由于dom操作極其昂貴,所以嘗試過多的dom操作有可能會將瀏覽器搞崩潰,比如onresize、onscroll這類事件操作;為了解決這個問題,引出防抖的概念(某些代碼不可以在沒有間斷的情況下連續重復執行&#…

百萬用戶規模的系統如何擴展

摘要:系統擴展一直是個讓人頭疼的事情,MatinKleppmann通過本文分享了他自己的6條經驗,外加網友的一條建議,這些經驗對于擴展Twitter這樣規模的系統或許幫助不大,但是對于百萬用戶級別的系統擴展就另當別論了。 【編者…

springboot 項目輸出 sql 到控制臺、 SpringBoot 中 Mybatis 打印 sql

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 SpringBoot中Mybatis打印sql 如果使用的是 application.properties 文件,加入如下配置: logging.level.com.ex…

JS流程圖解決方案GoJS

GoJs簡介 一個實現交互類圖表(比如流程圖,樹圖,關系圖,力導圖等等)的JS庫 GoJS依賴于HTML5,所以請保證您的瀏覽器版本支持HTML5,當然還要加載這個庫。 首先個人建議先下載官方實例的 離線版本【…

VUE.JS 組件化開發實踐

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 前言 公司目前制作一個H5活動,特別是有一定統一結構的活動,都要碼一個重復的輪子。后來接到一個基于模板的活動…

Space Time Varying Color Palette

PDF Space Time Varying Color Palettes from Bo Zhou轉載于:https://www.cnblogs.com/Jedimaster/p/4941857.html

提升開發效率的十個工具

Git 之前也有過不少版本控制的工具。有好的,也有糟糕的。不過它們都或多或少地誤入歧途了。 這時候Git出現了。一旦你用上了這個神奇的工具,很難相像你還會碰到比它更好的了。 還沒用過Git?試一下吧。 Stack Overflow 真的,我沒…

Virtual Villagers 攻略

和大家分享一下這個游戲的攻略心得,希望對大家有幫助~~Puzzle 1 清潔水井(難度:簡單)將一個擁有Building技能的村民拖到水井上就可以了。Puzzle 2 房屋建設(難度:簡單)一開始會由一個掌握Building技能的村民…

input 框 去掉下面的提示文字、提示選項

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. 我的一個輸入框總是有提示文字: 2. 去掉方法,給 input 加一個屬性: autocomplete"off"…

科學合理的減肥

1、科學安排一日三餐    在正常生理情況下,一般人習慣于一日三餐。人體最大消耗是在一天中的上午。由于胃經過一夜消化早已排空,如果不吃早飯,那么整個上午的活動所消耗的能量完全要靠前一天晚餐提供,這就遠遠不能滿足營養需要。…