使用HTTP/2的REST API

51
几个月前,HTTP/2作为RFC7540发布。
这将如何影响基于HTTP/1.1构建的现有REST API?
根据Wikipedia,HTTP/2添加了新功能。
我们如何利用这些新功能?
3个回答

49
HTTP/2保留了HTTP的主要语义,因此仍具有HTTP方法(例如GET,POST等),HTTP头和URI来标识资源。与HTTP/1.1相比,HTTP/2发生的变化是如何在网络中传输HTTP语义(例如,“我想在主机example.com上PUT资源/foo”)。 在这种情况下,基于HTTP/1.1构建的REST API将继续像以前一样透明地工作,无需对应用程序进行任何更改。运行应用程序的Web容器将代表应用程序处理新的线路格式,并且应用程序只会看到更高级别的HTTP语义,无论它是通过HTTP/1.1还是通过HTTP/2在线路上传输的。 由于HTTP/2线路格式更高效(特别是由于多路复用和压缩),基于HTTP/2的REST API也将从中受益。 HTTP/2中存在的另一个主要改进是HTTP/2 Push,旨在高效下载相关资源,可能在REST用例中没有用处。 HTTP/2的典型要求是部署在TLS之上。这需要部署者从http转移到https,并设置所需的基础架构来支持它(从受信任的机构购买证书,更新证书等)。

1
那么您不需要更改任何与Web应用程序/ API相关的内容吗?只需在服务器上进行配置(包括TLS),它就可以正常工作了吗? - greenhoorn
1
没错。我不能代表所有的Web服务器,但对于Jetty(我是一个提交者),你只需要使用http2模块配置Jetty,就可以开始了。 - sbordet
4
这段话在一篇名为 Guy Levin 的作者发表的 DZone 文章中有逐字的复制:https://dzone.com/articles/benefits-of-rest-apis-with-http2#20 (或者说是另一个方向上的,看这里的日期就知道了...) - serverhorror
2
这是一个很好的总结,但还有一个补充:服务器推送对于REST API非常有用,它改变了一切,解决了过度/不足获取的问题。Vulcain利用较新的Preload头让客户端选择他们想要的推送。https://github.com/dunglas/vulcain#pushing-relations - Phil Sturgeon
@Phil 服务器推送能做什么,而 WebSockets 多年来不能做的呢?我还没有看到 HTTP/2 相对于 1.1 对于 REST API 的任何真正优势。 - Voo
显示剩余2条评论

12

HTTP/2规范有意没有引入应用程序员的新语义。实际上,主要的客户端库(如iOS上的NSUrlSession、Android上的OkHttp、React Native、浏览器环境中的JS)已经透明地支持HTTP/2,您作为开发人员不需要做任何修改。

由于HTTP/2能够在单个TCP连接上复用多个请求,一些应用程序开发人员过去实现的优化(例如请求批处理)将变得过时甚至会产生反效果。

推送特性可能会被用于传递事件,并且有可能在某些应用程序中取代轮询和Websockets。

HTTP/2中服务器推送特性在REST API中的一个可能的应用是能够通过提前向客户端推送预期请求来加速旧应用程序,例如在反向代理层面上。例如,在登录请求完成后立即推送用户配置文件和其他常见API调用。

然而,Push在服务器和客户端基础架构中尚未广泛实现。


我猜HTTP/2确实引入了一些新的语义(例如服务器推送),但它并不改变任何现有的HTTP/1.x语义,因此它是向后兼容的。因此,Web应用程序可以透明地升级到HTTP/2。 - zeronone

2
我认为的主要优点是针对超媒体RESTful API的服务器推送,这些API包含对资源的引用,通常是绝对依赖于域的URL,例如/post/12
示例:GET https://api.foo.bar/user/3
{
  "_self": "/user/3"
  "firstName": "John",
  "lastName": "Doe",
  "recentPosts": [
    "/post/3",
    "/post/13",
    "/post/06
    ]
}

在HTTP/2中,服务器可以使用Push功能来预先填充浏览器缓存,如果服务器知道客户端可能会在未来进行某些GET请求。例如,在上面的示例中,如果启用并正确配置了HTTP/2 Server Push,则可以将/post/3、/post/13和/post/06与/user/3一起传递。对其中一个帖子的连续GET将导致缓存响应。此外,缓存摘要草案将允许客户端发送有关其缓存状态的信息,避免不必要的推送。这对于基于超媒体驱动的API比嵌入式主体(如HAL)更实用。有关原因的更多信息,请参见REST中嵌入问题以及如何通过HTTP/2解决它们

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