それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

http ヘッダでブラウザをリロードする retry-after と refreshヘッダ

時間のかかる処理のHTTPリクエストへの対応

HTTPリクエストで、時間のかかる処理を受け取った時どうするか。

すぐに思いつくのは websocket や ajax で pollingしたりpush 通知する方法でしょうが、面倒くさいんだよね。

http ヘッダを見なおしてみる

ブラウザにリロードを命令する方法が無いのか、ヘッダを見なおしてみた。

  • retry-after ヘッダ
  • refresh ヘッダ

この2つのヘッダが定義されていることがわかる。

retry-after はブラウザ実装が微妙

retry-after はまさにバッチ処理の為に作られたようなHTTPヘッダなのだが、これを見てるのはGoogleBotくらいらしい。

もし使うとしたら、 202 Accepted503 Service unavailable などとともに使うことになるだろうがブラウザ側が実装してないので、使えない

実際にChrome/Safariで実験してみたが、全く相手にされなかった。ツライ

Refresh ヘッダ

昔々の太古の時代からあるヘッダで、これは HTMLに記述して使われることが多かった。

<meta http-equiv="refresh:5 ; url=/page.html" />
<body>
ページをリダイレクトします
</body>

リダイレクトするページを入れるときは404ページのテンプレなどでよく使われた手段ですよね。邪魔だったから最近あまりみない。

http-equiv はヘッダ同等の意味なので

http-equiv で refresh が動くとは、すなわちHEADERに埋め込んで利用可能である。

<?php
header("refresh : 3 ; url= / ");

phpで例を記述しましたが、HTTPヘッダなので基本的にどこでも動作する。

URLには、相対パス絶対パス・完全URLが使える。リダイレクトで使えるものならなんでも出来そう。

時間のかかるバッチ処理へのリクエストに有効

バッチ処理をうけて、処理結果を待つときに、Refreshが使えそう。

Javascriptで良いじゃん?と思うんだろうけど、動画・画像・音楽など、HTML中にコンテンツを埋め込むときに処理待ちをさせるのに便利。

ローディングアイコンでクルクルさせるのもいいんだけど、画像などで使ったら、ブラウザを待たせるのに、とっても楽チンだと思うんだよね。

でも、画像に使えない。

ここまで書いていて何なんだけど、ブラウザは img 要素への refresh を全く無視してしまう。

惜しい、実に惜しい。画像生成を待たせるのに良いと思ったんだけどねー

onerror を使うしか無い

画像のonerror を使うしか無いね。サーバー側で 404などエラーを返すと onerror が発動するのでそこでリロードするしか無い。面倒くさい。

<img src="" onerror="function(){}" />