【问题标题】:Can fetch get object as headers?可以获取获取对象作为标题吗?
【发布时间】:2016-02-10 20:31:23
【问题描述】:

我正在尝试了解如何根据规范使用 whatwg fetch。具体来说,如果我能做到这一点,根据规范。

fetch("https://example.org", {headers:{'Content-Type', 'image/jpeg'}})

github's fetch polyfill 实际上可以做到这一点,也就是说,按照他们的话说,“尽可能接近标准 Fetch 规范”。

当我读到MDN documentation 时,我读到了这个

headers:要添加到请求中的任何标头,包含在 Headers 对象或 ByteString 中。

(编辑:我现在已经编辑了 MDN 页面,所以他们不再直接谈论 ByteStringHeaders 初始化。)

这意味着普通的对象是不允许的。

但是,这个文档并不完美,所以我查看了规范,它们以通常的冗长方式编写,我发现:

https://fetch.spec.whatwg.org/#request-class

请求类

Constructor(RequestInfo input, optional RequestInit init)

dictionary RequestInit {
...
  HeadersInit headers;
...
}

typedef (Headers or sequence<sequence<ByteString>> or OpenEndedDictionary<ByteString>) HeadersInit;

OpenEndedDictionary 是一个未来的 IDL 结构。期待它被使用 像这样:

var meta = { "Content-Type": "text/xml", "Breaking-Bad": "<3" }
new Headers(meta)

如果我没看错,这意味着这个对象实际上是可以使用的(OpenEndedDictionary 是......只是一个对象)。我理解正确吗?

(我会补充一点,通过我的实验,Firefox 和 Chrome 都接受 header 对象。)

我也看不到任何关于 headers 可以像 MDN 建议的那样直接从 ByteString 实例化的信息。

我还感兴趣的是不同的实现实际上现在接受什么。

【问题讨论】:

  • 这里的问题是OpenEndedDictionary 还没有在任何地方定义。 (这就是他们所说的“OpenEndedDictionary&lt;T&gt; 是未来的 IDL 构造”的意思。)它在HeadersInit 的 typedef 中使用,但规范没有正式说明 OpenEndedDictionary 是什么或它的行为方式。当作者开始定义它时,该规范给出了一点关于它可能如何工作的说明。因此,尚不清楚特定实现是否可以在这一点上符合规范,因为规范在这一点上明确含糊(并且有一天会变得不那么含糊)。
  • 好的,在这种情况下,我在我的问题中添加了一条注释:“我还感兴趣的是不同的实现现在实际接受的内容。”

标签: javascript fetch-api


【解决方案1】:

你可以试试这段代码:

var r = new Request('test.html', {
  headers: {
    'Custom-Header': 'test',
    'Content-Type': 'image/jpeg'
  }
});
for (h of r.headers) alert(JSON.stringify(h));

它适用于 Firefox 和 Chrome。我没有在 Opera 中尝试 the browsers currently supporting Fetch API

顺便说一句,MDN 不建议从ByteString 实例化。其实就是说ByteString is just String在JavaScript里。

【讨论】:

  • "您想要添加到请求中的任何标头,包含在 ... ByteString 中。" - 在我看来,您可以从字符串中创建 Headers 对象,如 new Headers("Header: Test"),但根据规范,这应该是不可能的。
  • 你是对的。解释是不准确和误导的。也许您可以将其改写为协作 wiki。
  • 我不想改写它,因为我不明白 :) 但好的,我会的
  • 我已经编辑了你的答案,所以它确实有效 + 它是一个可运行的 sn-p
  • 我不知道这个功能。非常感谢。这很酷。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多