鉴于我有rails控制器访问DB以检索数据并使用序列化器呈现JSON响应,必须满足哪些条件才能使rails响应304?
如果必须将先前的回复与当前检索的回答进行比较,那么它的比较是什么?
答案 0 :(得分:0)
服务器在同一请求者的先前和当前请求中查找Cache-Control,Content-Location,Date,ETag,Expires和Vary http标头值。
如果一切都相同,则返回304响应,否则更改内容并返回200。
您可以查看https://httpstatuses.com/304以获取更多信息。
答案 1 :(得分:0)
魔术发生在Rack::ETag
和Rack::ConditionalGet
中。 (我的位于$GEM_HOME/rack-1.5.5/lib/rack/conditionalget.rb
和$GEM_HOME/rack-1.5.5/lib/rack/etag.rb
。)
这些是中间件。
Rack::ETag
提取主体(机架函数@app.call
返回的主体)的摘要,并将响应ETag
标头设置为此值。至少对于Rails 4.0而言,它是MD5十六进制摘要。
Rack::ConditionalGet
将请求的If-None-Match
标头与响应的ETag
标头进行比较。如果它们匹配,则返回304。