我正在提出这样的请求:
fetch("https://api.parse.com/1/users", {
method: "GET",
headers: headers,
body: body
})
如何传递查询字符串参数?我是否只需将它们添加到 URL 中?我在文档中找不到示例。
我正在提出这样的请求:
fetch("https://api.parse.com/1/users", {
method: "GET",
headers: headers,
body: body
})
如何传递查询字符串参数?我是否只需将它们添加到 URL 中?我在文档中找不到示例。
您的第一个想法是正确的:只需将它们添加到 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,
})
只需将值替换到 URL 中,如下所示:
const encodedValue = encodeURIComponent(someVariable);
fetch(`https://example.com/foo?bar=${encodedValue}`);
是的,您只需要自己将查询字符串添加到 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}`);
这是一个 es6 方法
const getQueryString = (queries) => {
return Object.keys(queries).reduce((result, key) => {
return [...result, `${encodeURIComponent(key)}=${encodeURIComponent(queries[key])}`]
}, []).join('&');
};
在这里,我们接收一个查询对象,其形式为key: param
我们迭代并减少该对象的键,构建一个编码查询字符串数组。最后,我们进行连接并返回这个可附加的查询字符串。
我对Mark Amery 的回答做了一个小小的重复,它将通过 Airbnb 的 eslint 定义,因为现在许多团队似乎都有这个要求。
function objToQueryString(obj) {
const keyValuePairs = [];
for (let i = 0; i < Object.keys(obj).length; i += 1) {
keyValuePairs.push(`${encodeURIComponent(Object.keys(obj)[i])}=${encodeURIComponent(Object.values(obj)[i])}`);
}
return keyValuePairs.join('&');
}