使用 React Native 中的 Fetch 获取查询字符串

IT技术 reactjs react-native fetch query-string
2021-05-05 01:50:56

我正在提出这样的请求:

fetch("https://api.parse.com/1/users", {
  method: "GET",
  headers: headers,   
  body: body
})

如何传递查询字符串参数?我是否只需将它们添加到 URL 中?我在文档中找不到示例

4个回答

您的第一个想法是正确的:只需将它们添加到 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绝对不含有任何&=或其他特殊字符。

如果您在fetchReact 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('&');
}