跳到主要内容

URL-Encoding 请求体

application/x-www-form-urlencoded形式提交数据

默认情况下,axios 将 JavaScript 对象序列化为 JSON 格式。如果要以 application/x-www-form-urlencoded 格式发送数据,可以使用以下其中一种方法。

浏览器

在浏览器中,可以使用 URLSearchParams API,如下所示:

const params = new URLSearchParams()
params.append("param1", "value1")
params.append("param2", "value2")
axios.post("/foo", params)
提示

请注意,URLSearchParams 并非所有浏览器都支持(参见 caniuse.com ),但可以使用 polyfill (确保对全局环境进行 polyfill)。

另外,你还可以使用 qs 库对数据进行编码:

const qs = require("qs")
axios.post("/foo", qs.stringify({ bar: 123 }))

或者另一种方式(ES6):

import qs from "qs"
const data = { bar: 123 }
const options = {
method: "POST",
headers: { "content-type": "application/x-www-form-urlencoded" },
data: qs.stringify(data),
url
}
axios(options)

Node.js

查询字符串(Query string)

在 Node.js 中,可以使用querystring模块,如下所示:

const querystring = require("querystring")
axios.post("http://something.com/", querystring.stringify({ foo: "bar" }))

或者使用 'url 模块' 中的 'URLSearchParams',如下所示:

const url = require("url")
const params = new url.URLSearchParams({ foo: "bar" })
axios.post("http://something.com/", params.toString())

你还可以使用qs库。

提示

注意:如果需要对嵌套对象进行字符串化,建议使用 qs 库,因为 querystring 方法在这种情况下存在已知问题,见 https://github.com/nodejs/node-v0.x-archive/issues/1665

自动序列化

如果将 content-type 标头设置为 application/x-www-form-urlencoded,axios 将自动将数据对象序列化为 urlencoded 格式。

这在浏览器和 Node.js 中都适用:

const data = {
x: 1,
arr: [1, 2, 3],
arr2: [1, [2], 3],
users: [
{ name: "Peter", surname: "Griffin" },
{ name: "Thomas", surname: "Anderson" }
]
}

await axios.post("https://postman-echo.com/post", data, {
headers: { "content-type": "application/x-www-form-urlencoded" }
})

服务器将其处理为:

{
"x": "1",
"arr[]": ["1", "2", "3"],
"arr2[0]": "1",
"arr2[1][0]": "2",
"arr2[2]": "3",
"arr3[]": ["1", "2", "3"],
"users[0][name]": "Peter",
"users[0][surname]": "griffin",
"users[1][name]": "Thomas",
"users[1][surname]": "Anderson"
}

如果你的服务器框架的请求体解析器(例如 express.jsbody-parser )支持嵌套对象解码,你将自动收到与提交的相同的服务器对象。

Echo 服务器示例(express.js):

var app = express()

app.use(bodyParser.urlencoded({ extended: true })) // 支持url-encoded bodies

app.post("/", function (req, res, next) {
res.send(JSON.stringify(req.body))
})

server = app.listen(3000)