Ruby on rails 海关;理由短语;以及头部/渲染的状态代码

Ruby on rails 海关;理由短语;以及头部/渲染的状态代码,ruby-on-rails,http,Ruby On Rails,Http,我正在寻找一种方法,在使用 head 450 或者 Rails将使用HTTP/1.1450自定义响应,但我正在实现一个协议,其中需要返回HTTP/1.1450不同步。似乎没有办法通过render或head调用真正做到这一点。至少不是根据文档和简要浏览rails代码 也许这里有人知道一个聪明的诀窍如何做到这一点?我假设您只想为这些自定义代码添加新的状态代码+原因,而不是试图将200 OK转换为200 LOL 作为其他人可以扩展的部分答案,您可以使用以下内容创建初始值设定项: require 'r

我正在寻找一种方法,在使用

head 450
或者

Rails将使用
HTTP/1.1450自定义
响应,但我正在实现一个协议,其中需要返回
HTTP/1.1450不同步
。似乎没有办法通过
render
head
调用真正做到这一点。至少不是根据文档和简要浏览rails代码


也许这里有人知道一个聪明的诀窍如何做到这一点?

我假设您只想为这些自定义代码添加新的状态代码+原因,而不是试图将
200 OK
转换为
200 LOL

作为其他人可以扩展的部分答案,您可以使用以下内容创建初始值设定项:

require 'rack/utils'

custom_codes = {
  "Out Of Sync" => 450
}

custom_codes.each do |reason, code|
  # allow `status: :out_of_sync`
  Rack::Utils::SYMBOL_TO_STATUS_CODE[reason.tr(' ', '').underscore.to_sym] = code

  # tell it what reason to use for this status code
  Rack::Utils::HTTP_STATUS_CODES[code] = reason
end
现在当你这样做的时候:

head 450
head :out_of_sync
render status: 450
render status: :out_of_sync
Rails日志将显示:

Completed 450 Out Of Sync in 17ms
但是,当我在Safari中使用
curl
或开发人员工具时,它们仍然显示
450自定义
。我不确定Rack是在Rails将其交出来之后修改它,还是工具忽略了文本,只是显示了一条默认消息,或者正在发生什么。不幸的是,我现在没有时间进一步挖掘。

不要。如果您的协议依赖于原因短语,那么它就被设计破坏了

见:

“原因短语”元素的存在只是为了提供与数字状态代码相关联的文本描述,这主要是出于对早期互联网应用程序协议的尊重,而早期互联网应用程序协议更常用于交互式文本客户端。客户机应该忽略原因短语内容

它也在HTTP/2中被删除。

这不是我的协议,我正在使用依赖于此的服务。我知道客户应该忽略这句话,但事实并非如此,我也无权改变这句话。我可以处理它,也可以不使用他们的协议,这不是一个选项。但是谢谢
Completed 450 Out Of Sync in 17ms