Я делаю запрос следующим образом:
fetch("https://api.parse.com/1/users", {
method: "GET",
headers: headers,
body: body
})
Как передать параметры строки запроса? Я просто добавляю их в URL? Я не смог найти пример в docs.
Я делаю запрос следующим образом:
fetch("https://api.parse.com/1/users", {
method: "GET",
headers: headers,
body: body
})
Как передать параметры строки запроса? Я просто добавляю их в URL? Я не смог найти пример в docs.
Ваша первая мысль была правильной: просто добавьте их в URL.
Помните, что вы можете использовать строки шаблонов (обратные элементы) для упрощения ввода переменных в запрос.
const data = {foo:1, bar:2};
fetch(`https://api.parse.com/1/users?foo=${encodeURIComponent(data.foo)}&bar=${encodeURIComponent(data.bar)}`, {
method: "GET",
headers: headers,
body:body
})
Да, вы должны, в JS есть несколько классов, которые могут вам помочь, - https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams
например. если у вас есть параметры в объекте javascript, скажите
let params = {one: 'one', two: 'two'}
вы могли бы сказать эту функцию
let queryString = new URLSearchParams()
for(let key in params){
if(!params.hasOwnkey())continue
queryString.append(key, params[key])
}
то вы можете получить свою красиво отформатированную строку запроса, сказав
queryString.toString()
Просто замените значения в URL-адресе следующим образом:
const encodedValue = encodeURIComponent(someVariable);
fetch(`https://example.com/foo?bar=${encodedValue}`);
Да, вам просто нужно добавить строку запроса в URL самостоятельно. Вы должны позаботиться о том, чтобы избежать параметров строки запроса, однако - не просто создавать URL-адрес, например
`https://example.com/foo?bar=${someVariable}`
если вы не уверены, что someVariable
определенно не содержит никаких &
, =
или других специальных символов.
Если вы использовали fetch
вне React Native, у вас есть опция кодирования параметров строки запроса, используя URLSearchParams
, Однако React Native не поддерживает URLSearchParams
. Вместо этого используйте encodeURIComponent
.
Например:
const encodedValue = encodeURIComponent(someVariable);
fetch(`https://example.com/foo?bar=${encodedValue}`);
Если вы хотите сериализовать объект ключей и значений в строку запроса, вы можете сделать функцию утилиты для этого:
function objToQueryString(obj) {
const keyValuePairs = [];
for (const key in obj) {
keyValuePairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]));
}
return keyValuePairs.join('&');
}
... и используйте его следующим образом:
const queryString = objToQueryString({
key1: 'somevalue',
key2: someVariable,
});
fetch(`https://example.com/foo?${queryString}`);
Принятый ответ работает... но если у вас больше параметров, то вы ввернуты. Предлагаю следующий подход:
let route = 'http://test.url.com/offices/search';
if (method == "GET" && params) {
const query = Object
.keys(params)
.map(k => {
if (Array.isArray(params[k])) {
return params[k]
.map(val => `${encodeURIComponent(k)}[]=${encodeURIComponent(val)}`)
.join('&')
}
return `${encodeURIComponent(k)}=${encodeURIComponent(params[k])}`
})
.join('&')
route += `?${query}`;
}
EDIT: Обновлен ответ на работу с массивами.