请求的那些事🙆♂️
前言💕
- 前端🤦♂️:你的接口又报
400
了。 - 后端😡:我的接口没问题,
postman
请求都是好使的,肯定是你传参的问题。 - 前端🤷♀️:你出来,咱俩掰扯掰扯🤜。
- 后端🕵️♀️:来来来🤛。
拳脚相加的过程中问题解决了😅。上面的问题在工作当中肯定特别容易遇到,都是沟通上的问题今天就简单来说说,前端请求入参和后台接收参数🤞,让后端不在针对你🤣。
前期准备🎶
在工作当中用的最多的请求方式应该就是get
或者post
了😜,我们先下载postman或者apifox你不是说你用psotman
发请求吗,我就按照postman
的形式来模拟前端请求😉。
操练起来🏓
GET请求
一般GET
请求的传参是把参数包含在URL
中。
- 1.浏览器当前的实现是不允许
get
发送body
,但后端应用可以发送。比如nodejs
或postman
。 - 2.特殊情况可以用后端服务转发一下, 因为前端不能使用
get
方法从浏览器里发送body
。 - 3.
get
请求携带参数我们都采用params
传参。
postman
中发起一个带参数的get
请求
你可以看到我在url
中拼接了参数但是下方的params
中自动增加了key
和value
不管你信不信🤔,但是确实他是自动增加的👀,如果在params
中拼写参数,url
也会自动增加对应的key
和value
👏。
在axios
中模拟postman
发送GET
请求
1 |
|
因为涉及到跨域问题,我需要在vue.config.js
中做一个代理。
vue.config.js
如果后端不知道怎么接这些参数你告诉他可以下岗啦🤷♀️,我把我熟悉的列在下面,如果你们也是用以下语言做后台,可以直接甩给他😘。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
transpileDependencies: true,
devServer: {
// 当访问/api/xxx时会被代理到127.0.0.1:3000/xxx
proxy: {
'/api': {
target: 'http://127.0.0.1:3000/',
pathRewrite: {'^/api' : ''},
changeOrigin: true,
secure: false,
},
}
}
})
nodeJs
express
框架接收GET
参数
1 |
|
python
flask
框架接收GET
参数
1 |
|
POST请求
POST
请求的消息主体放在body
中🕵️♀️,服务端根据请求头中的Content-Type
字段来获取消息主体的编码⽅式,进⽽进⾏解析数据,我主要来介绍比较常用的一下3种类型👇。
application/x-www-form-urlencoded
👀
最常见的
POST
提交数据的⽅式如果不设置content-type
属性🥩,默认为application/x-www-form-urlencoded
⽅式提交数据🥙,提交的表单数据会转换为键值对并按照key1=val1&key2=val2
的⽅式进⾏编码key
和val
都进⾏了URL
转码🍞。
multipart/form-data
👀另⼀个常见的
POST
数据提交的⽅式😊,Form
表单的Content-Type
设置为multipart/form-data
🛴,它会将表单的数据处理为⼀条消息,以标签为单元,⽤分隔符分开🎑。由于这种⽅式将数据有很多部分🚖,它既可以上传键值对,也可以上传⽂件,甚⾄多个⽂件🐱👓。application/json
👀Content-Type: application/json
作为响应头⽐较常见🍱。实际上,现在越来越多的⼈把它作为请求头🥚,⽤来告诉服务端,消息主体是序列化后的JSON
字符串🍞,其中⼀个好处就是JSON
格式⽀持⽐键值对复杂得多的结构化数据🥡。
注意:如果您有二进制(非字母数字)数据(或相当大的有效载荷)要传输🍙,请使用
multipart/form-data
,其他情况建议使用application/x-www-form-urlencoded
或者application/json
🍗。
postman
中发起一个post
请求(application/x-www-form-urlencoded
)
在postman
中选择body
下的x-www-form-urlencoded
请求头会自动变成Content-Type:application/x-www-form-urlencoded
,无需我们手动在去修改请求头🥞。
在axios
中模拟postman
发送POST
请求
- 第一种方式
1
2
3
4// 如果有多个参数用&连接 但是如果参数过多我们使用这种方式就显得太傻了,建议采用第二种方式
axios.post("/api/wpfk/getEnterpriseInfo","qymc=xxxxx").then(function (response) {
console.log(response.data);
}); - 第二种方式 引用
qs
库1
2
3
4
5
6
7
8// npm install qs --save 安装qs库
import qs from 'qs'
axios.post("/api/wpfk/getEnterpriseInfo",qs.stringify({
qymc:'xxx'
})).then(function (response) {
console.log(response.data);
});nodeJs
express
框架接收POST
参数1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18// 第一步: 导入express
const express = require('express');
// 如果是post请求需要安装body-parser npm install body-parser --save
var bodyParser = require('body-parser')
// 第二步: 创建web服务器
const app = express();
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))
app.post('/wpfk/getEnterpriseInfo',function(req,res,next){
console.log(req.body.qymc)
res.send('Hello world.')
})
// 第三步: 启动服务器
app.listen(3000, ()=>{
console.log( ' 300服务启动了' )
})
python
flask
框架接收POST
参数
1 |
|
postman
中发起一个post
请求(multipart/form-data
)
postman
中选择body
下form-data
请求头会自动变成Content-Type:multipart/form-data
,无需我们手动在去修改请求头🍤。
在axios
中模拟postman
发送POST
请求
1 |
|
nodeJs
express
框架接收POST
参数
1 |
|
python
flask
框架接收POST
参数
1 |
|
postman
中发起一个post
请求(application/json
)
在postman
中选择body
下的row
右侧类型选择JSON
请求头会自动变成Content-Type:application/json
,无需我们手动在去修改请求头🍬。
注意:写内容的时候一定要是标准的
JSON
使用双引号。
在axios
中模拟postman
发送POST
请求
1 |
|
nodeJs
express
框架接收POST
参数
1 |
|
python
flask
框架接收POST
参数
1 |
|
- 问:为什么不写一个
java
的接收参数😧。
- 答:我不会😌!
- 问:为什么在发起请求的时候 请求类型
multipart/form-data
需要设置请求头而其他情况不需要设置请求头😧?- 实际上在其他请求中设置请求头也是不会出错的🥠,但是由于智能的
axios
跟postman
一样会自动设置不同的请求头,我们就不需要在重新设置啦😙。axios
在传递json
序列化参数的时候默认的请求头是application/json
🥧,所以在请求类型是multipart/form-data
的时候需要单独指定请求头🍮,否则就会变成application/json
🍣。
总结
以上只是说了比较常用的几种方式,应该可以满足基本的日常工作了🦪,如果你的后端还质疑你的传参就把这篇文章甩过去,愿人间没有400状态码
存在!🙏
参考链接
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!谢谢