【问题标题】:Use Http/2 to make api calls from javascript使用 Http/2 从 javascript 进行 api 调用
【发布时间】:2016-12-19 16:33:30
【问题描述】:

我知道大多数浏览器都支持 http/2 来加载页面,但这是否意味着我可以在使用 XmlHttpRequest 进行 api 调用时利用它?

更具体地说,我的问题是,如果我使用 XmlHttpRequest 进行 2 次调用来获取数据,是否能确保它们都使用下面的相同 tcp 连接?我在任何地方阅读的任何文档都没有说明有关 http2 对 XmlHttpRequest 的支持或我如何显式打开 http2 连接、利用它进行一些调用然后关闭连接的任何事情。

java 中的 okHttp、jetty 和其他库提供了客户端库来支持这一点。但是javascript支持不清楚。

【问题讨论】:

    标签: javascript xmlhttprequest http2


    【解决方案1】:

    当浏览器和服务器都支持 HTTP/2 时,它将用于来自浏览器的所有调用 - 包括 XHR。你不需要在你的 javascript 中做任何特别的事情来启用它。这是 HTTP/2 实现方式的一大优点。

    如果您询问如何确保连接保持打开状态,因为您想重用连接,那么http/2 spec 会说:

    HTTP/2 连接是持久的。为了获得最佳性能,它是 预计客户端不会关闭连接,直到它 确定不需要与服务器进行进一步通信 (例如,当用户离开特定网页时) 或者直到服务器关闭连接。

    ...

    鼓励服务器尽可能长时间地保持打开的连接 可能,但可以在必要时终止空闲连接。

    【讨论】:

    • 我认为浏览器不会永远保持 tcp 连接打开。它如何知道何时打开和何时关闭 tcp 连接?这就是我怀疑支持的原因。
    • 如果有任何支持该理论的文档,那将有很大帮助。我找不到任何东西。
    • 我知道 http2 规范是怎么说的,并且知道浏览器通过 http/2 加载 html 和相关的 css、js 资源,利用单个 tcp 连接和推送承诺以实现低延迟。尚不清楚浏览器如何处理直接 api 调用。
    • 您不能在 http/2(也不是 http/1.1)下保证这一点,因为这取决于浏览器和服务器。您甚至无法使用 Java 客户端来控制它,因为服务器可以随时删除它(连接空闲、服务器忙或其他原因)。要点是浏览器处理 api 调用的方式与加载普通 html、css 或 javascript 的方式不同(尽管感谢您的观点,即如果在短时间内加载不同连接的可能性较小)。建议您将服务器场设置为以某种方式始终如一地路由请求(例如,基于客户端 IP 地址 - 尽管这些也可以更改)。
    • 尚未使用 Alexa api,但似乎他们建议每 5 秒 ping 一次以保持连接有效 (developer.amazon.com/public/solutions/alexa/alexa-voice-service/…)。你可以使用 javascript 来做同样的事情,假设浏览器使用它来保持连接活动(除了我给出的规范之外,没有在任何规范中指定,并且浏览器之间很可能会有所不同)。虽然仍然没有 100% 的保证,这就是为什么下面讨论如何处理服务器断开连接的部分。
    猜你喜欢
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 2012-02-15
    • 2019-08-16
    相关资源
    最近更新 更多