当前位置: 首页 > 知识库问答 >
问题:

对于节点HTTP2推送流,请求头和响应头的用途是什么?

丁嘉
2023-03-14

当节点HTTP2服务器创建新的推送流时,请求头和响应头的用途是什么?

服务器代码:

http2Server.on('stream', (stream) => {
  stream.pushStream({ ':path': '/' }, (err, pushStream, headers) => { // send request headers
    pushStream.respond({ ':status': 200 });                           // send response headers
    pushStream.end('some pushed data');
  });
  stream.end('some data');
});

客户端代码:

clientHttp2Session.on('stream', (pushedStream, requestHeaders) => { // receive request headers
  pushedStream.on('push', (responseHeaders) => {                    // receive response headers
    /* Process response headers */
  });
  pushedStream.on('data', (chunk) => { /* handle pushed data */ });
});

这两个都必须在发送任何数据之前发送,所以其中一个似乎是多余的?

MDN指出:

请求标头包含有关要获取的资源或有关请求资源的客户端的更多信息。

响应头包含有关响应的附加信息,如其位置或提供响应的服务器。

然而,这似乎倾向于一种更具客户端请求、服务器响应的模型——它不适用于推送。

共有1个答案

鲜于峰
2023-03-14

您所调用的"请求头"映射到HTTP/2中的PUSH_PROMISE帧(您可以在NodeJS源代码中看到这一点)。

HTTP/2规范中定义了一个PUSH_PROMISE框架,用于告诉客户机“嘿,我要假装你发送了这个请求,然后给你发送一个对这个‘假请求’的响应。”

它用于通知客户端此响应正在进行中,如果它需要它,则不必费心为它发出另一个请求。

它还允许客户端用一个RST_流框取消这个推送请求,框中写着“不,谢谢,我不想那样。”这可能是因为服务器正在推送客户端缓存中已有的资源,或者是出于其他原因。

 类似资料:
  • 主要内容:1 HTTP Request Header请求头,2 HTTP Response Header 响应头本文列出了日常开发中常见的请求头和响应头,以供大家参考。 1 HTTP Request Header请求头 Header 说明 示例 Accept 指定客户端能够接收的内容类型 Accept: text/plain, text/html  Accept-Charset 浏览器可以接受的字符编码集。 Accept-Charset: iso-8859-5  Accept-Encoding

  • 主要内容:本节引言:,1.HTTP请求之消息头:,2.HTTP响应之响应头:,3.代码验证响应头的作用:,本节小结:本节引言: 上节中我们对Android涉及的网络编程进行了了解,也学习了下Http的基本概念,而本节我们 要学习的是Http的请求头与响应头,当然,可以把也可以把这节看作文档,用到的时候来查查 即可! 1.HTTP请求之消息头: 这里贴下上一节给出的图,根据下面给出的表,大家自己感受下相关请求头的作用吧: PS:第一行是请求行:请求方式 + 资源名称 + HTTP协议版本号,另外请

  • 那么,这种情况下有没有变通的办法呢?我是否应该使用简单的rest客户端,比如reverfit,或者在每个新请求上创建新的ApolloClient和OkHttpClient实例,并带有所需的头集?或者也许还有别的变通办法?

  • 我试图找出一个跨领域的API问题。我有一个用Sencha Touch 2.3.1创建的应用程序,它使用Ajax从远程服务器获取数据。我面临的问题是,所有针对本地服务器的Ajax请求在响应中并不包含所有的头。在远程服务器上,一切正常,标题也正常。 以下是两个打印件,显示了每个服务器单独发送和接收的标头 1 -从本地主机发送和接收的头(http://local.api - vhost) 收到的邮件头:

  • 我正在使用改造2.x,我想记录请求和响应的标头和正文。 这是我正在做的,我的问题是请求的标题没有被记录在Android Monitor中,但其余的一切都被记录了。 Gradle版本 使用RC1和3.0.1由于错误问题报告错误链接

  • 剪辑过,我剪短了。 代码变量被赋值 首先需要用get请求触发php脚本,输出不应该保存 然后,当上面的请求完成后,将get请求发送到并将响应保存到一个变量, 对于https://flower.nyaizhel.ml/fun/carbon/shorturl.php?short&code=ii,它应该是6,请参阅url 我试着取,没有结果