我写的小程序 "水果机大全" 用了我自己搭建的一个 api,使用 wx.request 从这个 api 请求数据时返回了 400 (Bad Request)
。官方给出的 wx.request 的使用方法是这样的:
wx.request({
url: "some url",
data: {
x: "",
y: "",
},
header: {
"content-type": "application/json",
},
success(res) {
console.log(res.data);
},
});
搜了一下,大部分小伙伴建议把 'application/json'
修改为 'json'
,我试了还是返回 400
。我登录 api 的服务器查了一下日志,当我的小程序发出请求时,服务器返回 typeerror: invalid media type
,看来确实是 content-type
设置不当造成的。
我的 api 格式大概是 https://api.kejiweixun.com/something?key=value
,下面是我发起请求的方式:
wx.request({
url: "https://api.kejiweixun.com/something?key=value",
success(res) {
console.log(res.data);
},
});
没有写 header
,但因为 'content-type': 'application/json'
是默认值,不设置 header 就默认采用这个值,返回 400 说明 application/json
不对。
最后我改成了这样:
wx.request({
url: "https://api.kejiweixun.com/something",
data: {
x: "key",
y: "value",
},
header: {
"content-type": "application/x-www-form-urlencoded",
},
success(res) {
console.log(res.data);
},
});
把 ?key=value
挪到 data
中,然后把 content-type
设置为 application/x-www-form-urlencoded
,其实设置为 multipart/form-data
也能正常请求数据,但通常当上传文件时才用这个。
小程序官方文档表示,对于 GET 方法,data 中的数据会自动地转换成 query string。对于 POST 方法,默认的 header 是 'content-type': 'application/json'
,这时候会把 data 进行 JSON 序列化;也可以明确地把 header 设置为 'content-type': 'application/x-www-form-urlencoded'
,这样 data 会像 GET 方法那样变成 query string。如果用 expressjs 作为后台,后台可通过 req.query 获取 GET 传过来的 data,通过 req.body 获取 POST 传过来的 data。