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

axios?發(fā)?post?請求,后端接收不到參數(shù)的完美解決方案

 更新時(shí)間:2022年12月01日 10:36:14   作者:Never?Yu  
這篇文章主要介紹了axios?發(fā)?post?請求,后端接收不到參數(shù)的解決方案,場景很簡單,就是一個(gè)正常 axios post 請求,本文給大家分享問題原因分析及解決方案需要的朋友可以參考下

問題場景

場景很簡單,就是一個(gè)正常 axios post 請求:

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

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

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

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

問題原因

要點(diǎn)1

原因就是這次的接口使用 java spring mvc
并且在這個(gè)方法上使用了注解 @RequestParam

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

要點(diǎn)2

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

application/json;charset=UTF-8

關(guān)于這一點(diǎn)需要說明的是:

1、axios會幫我們 轉(zhuǎn)換請求數(shù)據(jù)和響應(yīng)數(shù)據(jù) 以及 自動轉(zhuǎn)換 JSON 數(shù)據(jù)

2、在 axios 源碼中發(fā)現(xiàn)下面這段內(nèi)容:(很關(guān)鍵)

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

【第一種形式】

【第二種形式】

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

問題分析

也就是說,我們的 Content-Type 變成了 application/json;charset=utf-8
然后,因?yàn)槲覀兊膮?shù)是 JSON 對象,axios 幫我們做了一個(gè) stringify 的處理。
而且查閱 axios 文檔可以知道:axios 使用 post 發(fā)送數(shù)據(jù)時(shí),默認(rèn)是直接把 json 放到請求體中提交到后端的。

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

解決方案

解決方案一

【用 URLSearchParams 傳遞參數(shù)】

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

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

解決方案二

網(wǎng)上有很多方案說使用
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
或者
{headers:{'Content-Type':'application/x-www-form-urlencoded'}}
我試了一下,其實(shí)這樣還是不行的
【還需要額外的操作,(我們要將參數(shù)轉(zhuǎn)換為query參數(shù))】
引入 qs ,這個(gè)庫是 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 源碼中有那么一段【很關(guān)鍵】的代碼,那么,我們也可以通過修改 transformRequest 來達(dá)到我們的目的。

在 axios 的請求配置項(xiàng)中,是有 transformRequest 的配置的:

這里寫圖片描述

OK,那么現(xiàn)在我們的請求就可以寫成下面這個(gè)樣子了:

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

解決方案四

【重寫一個(gè) axios 實(shí)例,重新實(shí)現(xiàn)屬于我們自己的 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'");

解決方案六

我們知道現(xiàn)在我們服務(wù)端同學(xué)接收參數(shù)用的是 @RequestParam(通過字符串中解析出參數(shù))
其實(shí)還有另一種是 @RequestBody(從請求體中獲取參數(shù))。

到此這篇關(guān)于axios 發(fā) post 請求,后端接收不到參數(shù)的解決方案的文章就介紹到這了,更多相關(guān)axios 發(fā) post 請求后端接收不到參數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue如何自定義封裝API組件

    vue如何自定義封裝API組件

    這篇文章主要介紹了vue如何自定義封裝API組件,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • vue構(gòu)建動態(tài)表單的方法示例

    vue構(gòu)建動態(tài)表單的方法示例

    這篇文章主要介紹了vue構(gòu)建動態(tài)表單的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-09-09
  • VUE接入騰訊驗(yàn)證碼功能(滑塊驗(yàn)證)備忘

    VUE接入騰訊驗(yàn)證碼功能(滑塊驗(yàn)證)備忘

    這篇文章主要介紹了VUE接入騰訊驗(yàn)證碼功能(滑塊驗(yàn)證)備忘,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-05-05
  • vue實(shí)現(xiàn)購物車功能(商品分類)

    vue實(shí)現(xiàn)購物車功能(商品分類)

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)購物車功能,商品分類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • Vue兩種組件類型:遞歸組件和動態(tài)組件的用法

    Vue兩種組件類型:遞歸組件和動態(tài)組件的用法

    這篇文章主要介紹了Vue兩種組件類型:遞歸組件和動態(tài)組件的用法說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • 基于Vue渲染與插件的加載順序的問題詳解

    基于Vue渲染與插件的加載順序的問題詳解

    下面小編就為大家分享一篇基于Vue渲染與插件的加載順序的問題詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • Vue全局自定義指令Modal拖拽的實(shí)踐

    Vue全局自定義指令Modal拖拽的實(shí)踐

    最近一直在做的項(xiàng)目是Vue2搭建的項(xiàng)目,本文主要介紹了Vue全局自定義指令Modal拖拽的實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • vue中css如何使用data中的變量

    vue中css如何使用data中的變量

    這篇文章主要介紹了vue中css如何使用data中的變量問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • vue項(xiàng)目展示pdf文件的方法實(shí)現(xiàn)

    vue項(xiàng)目展示pdf文件的方法實(shí)現(xiàn)

    本文主要介紹了vue項(xiàng)目展示pdf文件的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • bpmn-js在vue中的基本使用及操作功能

    bpmn-js在vue中的基本使用及操作功能

    這篇文章主要介紹了bpmn-js在vue中的基本使用及操作功能,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友跟隨小編一起看看吧
    2024-02-02

最新評論

稷山县| 金门县| 梁山县| 锦州市| 焉耆| 巴塘县| 阿克| 荣昌县| 靖远县| 汤阴县| 稻城县| 东阿县| 宁明县| 年辖:市辖区| 宜良县| 龙州县| 寻乌县| 迁西县| 宁城县| 新和县| 陕西省| 乌鲁木齐县| 孟州市| 永城市| 怀柔区| 岗巴县| 苏尼特左旗| 高阳县| 普安县| 台北市| 苏尼特左旗| 白河县| 深水埗区| 宁乡县| 屯留县| 青神县| 股票| 万年县| 昭平县| 安泽县| 晋城|