如何在浏览器中实现HTTP/2流连接?

17

我不认为浏览器上有http2客户端。 - Lewis
3
如果服务器支持http/2,浏览器将使用http/2,不需要"实现客户端"。例如,您可以使用XHR或fetch。 - Jaromanda X
@JaromandaX fetch或XHR无法控制从服务器发送的推送承诺。我认为在浏览器上提供http2客户端仍然是有意义的。 - Lewis
你可以在这种情况下使用WebSockets @Lewis(什么是推送承诺?) - Jaromanda X
@JaromandaX 我的意思是,如果没有http2客户端(用于确定每个服务器推送状态、每个服务器推送响应等事件),则无法控制通过http2请求提供的文件。 - Lewis
许多现代浏览器都支持HTTP/2,因此应该有一些接口可供使用。 - Valeri
2个回答

18
目前您无法这样做。通常情况下,对于网页和Web应用程序,HTTP/2应该是透明的,因此无需实现低级HTTP/2流和连接详细信息。这是它实现的美妙之处之一 - 浏览器会处理所有这些,而网页和Web应用程序不需要知道使用了HTTP/1.1还是HTTP/2。
可能有一个例外,那就是HTTP/2推送,曾经有一个提案在Web超文本应用技术工作组(WHATWG)中以编程方式公开HTTP/2 Push: https://github.com/whatwg/fetch/issues/51。尽管活动似乎已经完全停止了。由于在实现Push通知api时存在一些复杂性,所以总体来说HTTP/2 push很复杂,特别是因为不同的浏览器实现和错误, 因此尝试向Web应用程序公开推送消息将会很复杂。许多人认为HTTP/2推送的用途有限,对于大多数用例来说,有更好的技术,如资源提示(用于请求HTTP资源)或Web套接字(用于双向通信)。Chrome甚至正在尝试完全关闭它
除了推送之外,优先级可能是将低级HTTP/2细节暴露给Web应用程序的另一个用例,也许优先级提示最终会提供一个映射,而不将其与HTTP/2绑定(因此可以在HTTP/1.1、QUIC或未来的任何协议下使用)。
所以,在我看来,我不认为有迫切的需要允许从Web应用程序创建或管理HTTP/2连接,就像没有一种简单的方法(据我所知)从JavaScript创建TCP或UDP连接一样。当这种情况仍然存在时,我认为我们不会看到太多的努力去创建这样的实现。即使您链接到的HTTP/2客户端非常基本,只是发出HTTP请求 - 浏览器已经允许您执行此操作(尽管我欣赏Node暴露更多详细信息,如果您想要比此更低级别的内容,而浏览器则不提供)。在大多数情况下,HTTP/2流处理和其他协议的低级细节可能最好由浏览器本身透明地处理 - 就像它们现在做的那样。

在浏览器中需要像HTTP/2中的双向流一样的功能,可能是因为想要重新创建websocket功能 - 目前使用HTTP/2不可能实现 - (真正的双向交换二进制数据)。 - whale70
3
WebSockets现在可以与HTTP/2一起使用(https://tools.ietf.org/html/rfc8441),尽管目前没有任何浏览器实现它们(Firefox似乎会在v65中推出 - https://bugzilla.mozilla.org/show_bug.cgi?id=1434137,而Chrome似乎已经停滞不前https://bugs.chromium.org/p/chromium/issues/detail?id=801564)。 相比使用具有更多开销的HTTP,Websockets可能是更好的选择:https://dev59.com/XlUL5IYBdhLWcg3wCEMA - Barry Pollard
太好了,谢谢你的提示 - 我期望Chrome在WebSocket over HTTP/2方面能够赶上Firefox。总体来说是个好消息! - whale70
1
我的使用情况是基于 wasm 的 Web 应用程序,我想使用 gRPC 与服务通信。 - daniatic

2
在客户端:
您无需在浏览器中做任何事情,只需要使用已支持HTTP 2.0协议的浏览器即可https://caniuse.com/#search=http2 在服务器端:
取决于您使用的服务器,您需要激活一些模块并配置一些文件,在这里您可以查看一些服务器配置链接:https://github.com/http2/http2-spec/wiki/Implementations 关于服务器推送功能:
同样,这取决于服务器,但重要的是要注意您可以配置手动推送或自动推送(Auto Push)
例如:
手动推送
server {    
    # whenever a client requests demo.html, also push
    # /style.css, /image1.jpg and /image2.jpg
    location = /demo.html {
        http2_push /style.css;
        http2_push /image1.jpg;
        http2_push /image2.jpg;
    }
}

自动推送
server { 
    # Intercept Link header and initiate requested Pushes
    location = /myapp {
        proxy_pass http://upstream;
        http2_push_preload on;
    }
}

//httpd.conf or .htaccess (cuando se cargue un html)
<FilesMatch "\.html$">
    Header set Link "</css/styles.css>; rel=preload; as=style"
<FilesMatch>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接