Возьмите следующий пример Axios:
axios.post(this.reportURL, reportData, {
params: {
param1: paramValue1,
param2: paramValue2
},
});
Как я могу сделать то же самое, используя API выборки? Я вижу, что параметры сделаны так:
fetch(this.reportURL, {
method: "POST",
body: "param1=paramValue1¶m2=paramValue2",
headers:
{
"Content-Type": "application/x-www-form-urlencoded"
}
})
Поскольку ключ body используется для хранения параметров, нужно ли сериализовать весь мой объект reportData и объединить его с существующими параметрами?
Я не понимаю, почему Fetch API использует ключ тела для параметров.
Кроме того, это не мой собственный API, и я не могу изменить ожидаемый запрос POST.
5 ответов
К сожалению, fetch()
не предоставляет «чистого» способа предоставления параметров URL строки запроса. Вы должны просто поместить их в URL, который вы получаете непосредственно. Вы можете прочитать об этом на GitHub: Как передать параметры URL-запроса? # 256.
Есть несколько способов, которыми вы можете смоделировать это:
const url = new URL("http://www.example.com");
const params = {
foo: "bar",
fizz: "buzz"
};
const data = {
more: "data",
that: "I",
want: "to",
send: "please"
};
Object.entries(params).forEach(([k, v]) => url.searchParams.append(k, v));
console.log(url);
fetch(url, { // URL as http://www.example.com/?foo=bar&fizz=buzz
method: "POST",
body: JSON.stringify(data) // The actual body
});
Поскольку в вашем вопросе также есть application/x-www-form-urlencoded
, вы можете посмотреть на этот вопрос также: Опубликовать x- www-form-urlencoded запрос от React Native.
Если вам нужно создать строку параметров запроса из хэша и вы используете jQuery на своем сайте, вы можете сделать:
var url = "http://www.abx.com?" + $.param({foo: "bar", baz: "kuuq"})
fetch(url)
Вот что стандарт fetch рекомендует в своей документации (см. Также обсуждение в whatwg / fetch # 56):
var url = new URL("https://geo.example.org/api"),
params = {lat:35.696233, long:139.570431}
Object.keys(params).forEach(key => url.searchParams.append(key, params[key]))
fetch(url).then(...)
Для этого необходимо, чтобы браузер реализовал url.searchParams. Polyfill может понадобиться для старых браузеров.
Прочтите это быстро, но, надеюсь, это помогло
Источник: https://github.com/github/fetch/issues/256
Вы можете extract
фрагментов из reportData
в другой объект и передать его в fetch
с помощью JSON.stringify.
Fetch также поддерживает FormData
, но это не так сильно отличается от объектного подхода, который я уже упоминал.
В по документам вы можете указать body следующим образом:
- ArrayBuffer
- ArrayBufferView (Uint8Array и друзья)
- Blob / файла
- строка
- URLSearchParams
- FormData
Ты можешь сделать body: JSON.stringify ({ param1: paramValue1, param2: paramValue2 } ) Код >
Похоже, что вы близки, но во втором примере, когда вы делаете запрос POST, параметры обычно идут в теле запроса как JSON:
fetch(this.reportURL, {
method: "POST",
body: JSON.stringify({
param1: paramValue1,
param2: paramValue2
})
})
Похожие вопросы
Связанные вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.