使用 Fetch GET 请求设置查询字符串

IT技术 javascript jquery http fetch-api
2021-01-21 18:53:45

我正在尝试使用新的Fetch API

我正在提出这样的GET请求:

var request = new Request({
  url: 'http://myapi.com/orders',
  method: 'GET'
});
fetch(request);

但是,我不确定如何向GET请求添加查询字符串理想情况下,我希望能够向喜欢的人GET提出请求URL

'http://myapi.com/orders?order_id=1'

jQuery我可以通过{order_id: 1}作为data参数传递来做到这一点$.ajax()有没有等效的方法来使用 new 来做到这一点Fetch API

6个回答

2017 年 3 月更新:

URL.searchParams支持已正式登陆 Chrome 51,但其他浏览器仍然需要polyfill


使用查询参数官方方法是将它们添加到 URL 中。规范,这是一个例子:

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(/* … */)

但是,我不确定 Chrome 是否支持searchParamsURL属性(在撰写本文时),因此您可能想要使用第三方库推出自己的解决方案

2018 年 4 月更新:

通过使用URLSearchParams 构造函数,您可以分配一个二维数组或一个对象,然后将其分配给url.search而不是循环遍历所有键并附加它们

var url = new URL('https://sl.se')

var params = {lat:35.696233, long:139.570431} // or:
var params = [['lat', '35.696233'], ['long', '139.570431']]

url.search = new URLSearchParams(params).toString();

fetch(url)

旁注:URLSearchParams在 NodeJS 中也可用

const { URL, URLSearchParams } = require('url');
2021-03-12 18:53:45
new URLSearchParamsArray属性似乎无法正常工作我希望它将属性转换array: [1, 2]array[]=1&array[]=2,但将其转换为array=1,2. 手动使用append方法确实会导致array=1&array=2,但我必须遍历 params 对象,并且仅对数组​​类型执行此操作,不是很符合人体工程学。
2021-03-21 18:53:45
还有developer.mozilla.org/en-US/docs/Web/API/URLSearchParams/...,但在撰写本文时,它仍在通过规范,尚未得到很好的支持。而且 API 更像是 Java 而不是 JS。:/
2021-03-23 18:53:45
来自文档:“请注意,不推荐使用 URLSearchParams 实例;很快浏览器将只使用 USVString 进行初始化。” 来源:developer.mozilla.org/en-US/docs/Web/API/URLSearchParams/...
2021-03-28 18:53:45
请参阅caniuse.com/#feat=urlsearchparams以获取对URLSearchParams接口的支持我会假设(虽然我不是 100% 确定)红色的浏览器正是那些URL对象不具有该.searchParams属性的浏览器重要的是,Edge 仍然没有支持。
2021-04-09 18:53:45

简洁、现代的方法:

fetch('https://example.com?' + new URLSearchParams({
    foo: 'value',
    bar: 2,
}))

URLSearchParams 的 toString()函数会将提供的查询参数转换为字符串。在 JavaScript 中,当您将一个对象与一个字符串连接起来时,该对象的 toString() 函数将自动为您调用。您可能更愿意更明确地了解这里发生的事情,并在将两个值连接在一起之前选择自己调用 .toString() ,如下所示:fetch('https://...' + new URLSearchParams(...).toString())


IE 不支持 URLSearchParams(或 fetch),但有可用polyfills

如果使用 node,您可以通过node-fetch 之类的包添加 fetch API URLSearchParams 带有节点,从版本 10 开始可以作为全局对象找到。在旧版本中,您可以在require('url').URLSearchParams.

如果你同时使用 node 和 typescript,你会发现,由于一些技术限制,typescript 不提供全局 URLSearchParams 的类型定义。最简单的解决方法是从 URL module中导入它。请参阅此处了解更多信息。

@ScottyJamison 感谢您的回复。我从文档中发现了这一点,但是如果我无法传入 dict 并在另一端获取预期的搜索参数,它就会使 URLSearchParams 对我毫无用处。
2021-03-21 18:53:45
这似乎无法正确处理同一个键的多个值。我期望能够写,new URLSearchParams({foo: ['bar', 'baz']})foo=bar&foo=baz它不会被转义,因为foo=bar%Cbaz
2021-03-27 18:53:45
@jymbob 要具有多个值,您必须在 URLSearchParams 上使用 .append() 方法。例如s = new URLSearchParams({foo: 'bar'}); s.append('foo', 'baz'); s.toString()或者,构造函数可以采用列表列表而不是对象。new URLSearchParams([['foo', 'bar'], ['foo', 'baz']]).toString()有关更多使用信息,请参阅文档页面:developer.mozilla.org/en-US/docs/Web/API/URLSearchParams
2021-03-31 18:53:45
感谢分享。我认为这应该是可以接受的答案。要求将参数传递给 fetch API,虽然这是不可能的,但这个答案非常接近结构中的样子。
2021-04-02 18:53:45
更简洁的方法是使用字符串插值:``` https://example.com?${new URLSearchParams({foo: 'value'})}``` developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-04-06 18:53:45
let params = {
  "param1": "value1",
  "param2": "value2"
};

let query = Object.keys(params)
             .map(k => encodeURIComponent(k) + '=' + encodeURIComponent(params[k]))
             .join('&');

let url = 'https://example.com/search?' + query;

fetch(url)
  .then(data => data.text())
  .then((text) => {
    console.log('request succeeded with JSON response', text)
  }).catch(function (error) {
    console.log('request failed', error)
  });
你需要对密钥进行编码吗?我从来没有这样做过。
2021-03-25 18:53:45
@chovy - 如果您的密钥包含特殊字符(如“&”),您会这样做。大多数时候它不会,但有时它可以。
2021-03-26 18:53:45

正如已经回答的那样,这对于fetch-API 来说是不可能的,但是。但我必须注意:

如果你在node,有querystring包裹。它可以字符串化/解析对象/查询字符串:

var querystring = require('querystring')
var data = { key: 'value' }
querystring.stringify(data) // => 'key=value'

...然后只需将其附加到要请求的 url。


但是,上面的问题是,您必须始终在前面加上问号 ( ?)。因此,另一种方法是使用parse节点url包中方法并按如下方式执行:

var url = require('url')
var data = { key: 'value' }
url.format({ query: data }) // => '?key=value'

queryhttps://nodejs.org/api/url.html#url_url_format_urlobj

这是可能的,因为它在内部只是这样

search = obj.search || (
    obj.query && ('?' + (
        typeof(obj.query) === 'object' ?
        querystring.stringify(obj.query) :
        String(obj.query)
    ))
) || ''

您可以使用#stringifyfrom查询字符串

import { stringify } from 'query-string';

fetch(`https://example.org?${stringify(params)}`)