@RequestParam和@RequestBody与contentType=aplication/json contentType=application/x-www-form-urlencoded

axios 发 post 请求,后端接收不到参数的解决方案

部分转载
@RequestParam和@RequestBody处理
请求方法对应的contentType
[POST传JSON字符串-解决方法四](@RequestParam 接受JSON的字符串)

1、请求方法对应的contentType

get请求的headers中没有content-type这个字段,键值对参数放置在 URL 尾部,浏览器把form数据转换成一个字串(name1=value1&name2=value2…),然后把这个字串追加到url后面,用?分割,加载这个新的url。因此请求头不需要设置 Content-Type 字段

post 的 content-type 有 :

  • application/x-www-form-urlencoded
    这种就是一般的文本表单用post传地数据,只要将得到的data用querystring解析下就可以了
  • multipart/form-data ,用于文件上传,此时form的enctype属性必须指定为multipart/form-data。请求体被分割成多部分,每部分使用—boundary分割。
  • application/json,将数据以json对象的格式传递
  • text/xml

2、@RequestParam和@RequestBody

当前台界面使用GET或POST方式提交数据时,数据编码格式由请求头的ContentType指定。分为以下几种情况:

  1. application/x-www-form-urlencoded,这种情况的数据@RequestParam、@ModelAttribute可以处理,@RequestBody也可以处理。
  2. multipart/form-data,@RequestBody不能处理这种格式的数据。(form表单里面有文件上传时,必须要指定enctype属性值为multipart/form-data,意思是以二进制流的形式传输文件。)
  3. application/json、application/xml等格式的数据,必须使用@RequestBody来处理。

3、解决方案

【用 URLSearchParams 传递参数】

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

【还需要额外的操作,(我们要将参数转换为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 的配置的:]

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'
	}
})
发布了16 篇原创文章 · 获赞 0 · 访问量 402

猜你喜欢

转载自blog.csdn.net/weixin_43532415/article/details/105647907