发送正文为 JavaScript 的 GET 请求 (XMLHttpRequest)
Send a GET request with a body in JavaScript (XMLHttpRequest)
我必须与从 GET 请求正文中获取参数的 API 进行交互。我知道这可能不是最好的主意,但这是构建 API 的方式。
当我尝试使用 XMLHttpRequest
构建查询时,似乎根本没有发送有效负载。您可以 运行 这个并查看网络选项卡;请求已发送,但没有正文(在最新的 Chrome 和 Firefox 中测试):
const data = {
foo: {
bar: [1, 2, 3]
}
}
const xhr = new XMLHttpRequest()
xhr.open('GET', 'https://my-json-server.typicode.com/typicode/demo/posts')
xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8')
xhr.send(JSON.stringify(data))
axios 等库是基于 XMLHttpRequest 构建的,因此它们也无法正常工作...
在JavaScript中有什么方法可以做到这一点吗?
不,无法发送正文为 JavaScript 的 GET 请求。
it looks like the payload is simply not sent
没错。这是在 the specification:
中定义的
The send(body)
method must run these steps:
...
- If the request method is
GET
or HEAD
, set body to null.
也是通过 Fetch API does not allow a body. From the specification 的请求:
- If either init["body"] exists and is non-null or inputBody is non-null, and request’s method is
GET
or HEAD
, then throw a TypeError.
如果 API 可以修复就最好了。
如果这不可能,您可以添加一个服务器端脚本,您可以将其用作将请求传递给 API 的代理。您可以使用 URL 中的数据而不是正文中的 GET 请求调用此脚本,或者使用带有正文的 POST 请求。该脚本然后可以使用正文发出 GET 请求(只要所选语言支持)。
我必须与从 GET 请求正文中获取参数的 API 进行交互。我知道这可能不是最好的主意,但这是构建 API 的方式。
当我尝试使用 XMLHttpRequest
构建查询时,似乎根本没有发送有效负载。您可以 运行 这个并查看网络选项卡;请求已发送,但没有正文(在最新的 Chrome 和 Firefox 中测试):
const data = {
foo: {
bar: [1, 2, 3]
}
}
const xhr = new XMLHttpRequest()
xhr.open('GET', 'https://my-json-server.typicode.com/typicode/demo/posts')
xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8')
xhr.send(JSON.stringify(data))
axios 等库是基于 XMLHttpRequest 构建的,因此它们也无法正常工作...
在JavaScript中有什么方法可以做到这一点吗?
不,无法发送正文为 JavaScript 的 GET 请求。
it looks like the payload is simply not sent
没错。这是在 the specification:
中定义的The
send(body)
method must run these steps:...
- If the request method is
GET
orHEAD
, set body to null.
也是通过 Fetch API does not allow a body. From the specification 的请求:
- If either init["body"] exists and is non-null or inputBody is non-null, and request’s method is
GET
orHEAD
, then throw a TypeError.
如果 API 可以修复就最好了。
如果这不可能,您可以添加一个服务器端脚本,您可以将其用作将请求传递给 API 的代理。您可以使用 URL 中的数据而不是正文中的 GET 请求调用此脚本,或者使用带有正文的 POST 请求。该脚本然后可以使用正文发出 GET 请求(只要所选语言支持)。