PUT 请求仅在 Chrome 或 Opera 中生成 SPDY 协议错误?

Posted

技术标签:

【中文标题】PUT 请求仅在 Chrome 或 Opera 中生成 SPDY 协议错误?【英文标题】:PUT request generates SPDY protocol errors only in Chrome or Opera? 【发布时间】:2016-12-23 12:26:31 【问题描述】:

我有一个 Angular 1.5 应用程序,它使用 Angular $resource provider 来处理对 API 后端的所有调用。我最近添加了一个具有拖放界面的功能,一旦将一个项目放入特定的存储桶中,我就会向公共 API 方法执行带有所有相关数据的PUT 请求以保存所述数据。

几个月前我开发了它,甚至在一个特定版本的仅 Mac 版 Chrome 中发现了一个奇怪的错误(我们已经超过了 2 或 3 个版本),但除此之外它运行良好。

我最近在自己进行了一些测试后才发布它,结果发现 Chrome 和 Opera 浏览器都在 PUT 调用时出错,API 从未收到请求。我得到的唯一信息是 Chrome 控制台中的以下描述:

PUT https://www.phpdraft.com/api/draft/59/pick/5026/depth_chart/37 net::ERR_SPDY_PROTOCOL_ERROR

要亲自查看,请访问以下网址:PHPDraft

我怀疑我的服务器使用 HTTPS 可能是这里的问题,但到目前为止我在 ERR_SPDY_PROTOCOL_ERROR 上所做的 Google 搜索充其量是神秘的,听起来好像它们不适用于我的情况。

以下是我在 Angular 应用程序中使用 $resource 进行此 PUT 调用(以及所有其他调用类似)的方式:

angular.module('app').factory('api', function($resource, ENV) 
  return 
    DepthChartPosition: $resource(ENV.apiEndpoint + "commish/draft/:id/depthchartposition/:position_id", 
      draft_id: '@draft_id',
      position_id: '@position_id',
      draft_sport: '@draft_sport',
      manager_id: '@manager_id',
      pick_id: '@pick_id'
    , 
      'update': 
        method: 'PUT',
        url: ENV.apiEndpoint + "draft/:draft_id/pick/:pick_id/depth_chart/:position_id"
      
    )
  ;
);

上面代码生成的请求本身是这样的:

General
Request URL:  https://www.phpdraft.com/api/draft/59/pick/5026/depth_chart/37

Request Headers
Accept:application/json, text/plain, */\*
Content-Type:  application/json;charset=UTF-8
Origin:  https://www.phpdraft.com
Referer:  https://www.phpdraft.com/draft/59/depth_chart
User-Agent:  Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/52.0.2743.116 Safari/537.36

Request Payload
draft_id: "59", position_id: "37", pick_id: "5026"

此请求的响应窗口为空,并且 devtools 将该请求显示为“已停止”。有什么想法吗?

【问题讨论】:

在 Linux 中的 Chrome 上复制错误。第一个谷歌搜索结果建议转到 chrome://net-internals/#events&q=type:SPDY_SESSION%20is:active 并刷新套接字。试过了,结果没有变化。请注意,在 SPDY 错误Failed to parse SourceMap: https://www.phpdraft.com/js/affix.min.js.map 之前我确实遇到过这个错误 有趣的是,你也得到了词缀映射错误。我明确地不构建应用程序来使用源映射,所以很好奇那个会一直存在(我也看到了)。我将输入一个单独的错误。 【参考方案1】:

截至今年 5 月 15 日,Chrome no longer supports SPDY 不再包含在当前版本中。

... 从 5 月 15 日开始——HTTP/2 RFC 周年纪念日——Chrome 将不再支持 SPDY。

...SPDY 和 NPN 支持将随着 Chrome 51 的发布而移除。

【讨论】:

我从未明确告诉我的应用程序或服务器使用 SPDY 协议(事实上,自从我看到 Robert Boedigheimer 关于 HTTP/2 的演讲后,我就非常熟悉它是什么以及它的用途已服务),那么为什么 Chrome 和 Opera 都会出现此错误?我的 Chrome 设置已明确关闭 SPDY(但 HTTP/2 已打开)。 @Mattygabe SPDY 也需要在服务器端设置,HTTP/2 也是如此。 Opera 的行为可能与 Chrome 相同,因为它使用与 Chrome 相同的引擎 Blink。 我与我的主机 (Accuwebhosting) 核实过,他们说他们不能放弃 SPDY 以支持 HTTP/2,因为它是共享主机,它可能会影响其他客户。我说这简直太棒了,因为 SPDY 只是 HTTP/2 工作组的实验性测试场,并不打算在任何地方用于生产。是时候寻找新主机了!

以上是关于PUT 请求仅在 Chrome 或 Opera 中生成 SPDY 协议错误?的主要内容,如果未能解决你的问题,请参考以下文章

仅在 Opera 上的 ajax 发布请求上的 Django CSRF 失败

仅在 Chrome 上出现 iframe 高度问题

选项(失败)仅在 Chrome 和 Firefox 上

POST 请求返回 401 Unauthorized(仅在 Chrome 中)

仅在 chrome 开发工具中使用 xhr 请求创建 har 文件

CORS 预检请求返回“403 Forbidden”;随后的请求,然后仅在 Chrome 中发送