11

皆さん、同じリソースの JSON および HTML 表現に同じルートを再利用した Web アプリケーションがあります。ここでは、/foo/details と呼びましょう。このページは /bar/details からリンクされています。(したがって、/bar/details を見ると、-> /foo/details へのリンクが表示されます)。

最初のページから 2 番目のページに移動すると、すべて正常に動作します。Chrome で戻るボタンをクリックすると、元のページが HTML ではなく JSON として表示されます。ブラウザーで更新を押すと、JSON ではなく HTML 表現が取得されます。

JSONとHTMLを検出するために使用しているコードは次のとおりです。

res.result.map { group =>
  render {
    case Accepts.Html() => Ok(views.html.groups.details(group))
    case Accepts.Json() => Ok(Json.toJson(group))
  }
}.getOrElse(NotFound)

これはこのパターンの標準的な実装であり、特定の状況で Chrome の [戻る] ボタンを使用する場合を除いて、どこでも機能します。

私がクリアしていない値がありますか、私のページがAjaxで行っていることで、PlayがJsonでレンダリングするのを混乱させていますか、またはChromeがページをキャッシュしていますが、間違った受け入れヘッダーをキャッシュしていますか??

Json用とHtml用の2つの異なるルートを使用することでこれを回避できますが、あきらめているように感じて嫌いです。

戻るボタンのみでこの動作を引き起こす原因について、誰か考えがありますか?

4

2 に答える 2

2

それは間違いなく Chrome のブラウザ キャッシュでした。"Accept"->"application/json" を使用して /foo/bar に対して行われたリクエストと、通常の HTML の Accept ヘッダーを使用したリクエストは区別されません。その結果、HTML ページを読み込むと、そのページの JavaScript が未加工の JSON データの同じ URL にヒットし、次にヒットすると、Chrome はキャッシュされた HTML の代わりにキャッシュされた JSON を提供します。

その結果、JSON/REST API がすべて異なる URL を通過するようにルートを変更して、Chrome (および Safari) が JSON をキャッシュしないようにする必要がありました。

于 2013-05-24T12:16:36.790 に答える