我正在寻找一种在使用
回复时设置自定义reason Phrase的方法head 450
或
render status: 450
Rails将使用HTTP/1.1 450 Custom
回复,但我正在实施一个需要返回HTTP/1.1 450 Out of Sync
的协议。似乎没有办法通过render
或head
来实现这一点。至少不是根据文档和简要浏览rails代码。
也许这里有人知道如何做到这一点的聪明伎俩?
答案 0 :(得分:0)
我假设您只想添加新的状态代码+这些自定义代码的原因,而不是尝试将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 CUSTOM
。我不确定Rack是否在Rails关闭之后修改了这个,或者工具是否忽略了文本,只显示了默认消息或正在发生的事情。不幸的是,我现在没有时间进一步挖掘。
答案 1 :(得分:-1)
别。如果您的协议依赖于原因短语,那么它就会被设计破坏。
请参阅https://www.greenbytes.de/tech/webdav/rfc7230.html#rfc.section.3.1.2.p.3:
原因 - 短语元素的存在仅仅是为了提供与数字状态代码相关联的文本描述,主要是出于对交互式文本客户端更常使用的早期Internet应用程序协议的尊重。客户端应该忽略原因短语内容
它也已在HTTP / 2中删除。