時間のかかる処理のHTTPリクエストへの対応
HTTPリクエストで、時間のかかる処理を受け取った時どうするか。
すぐに思いつくのは websocket や ajax で pollingしたりpush 通知する方法でしょうが、面倒くさいんだよね。
http ヘッダを見なおしてみる
ブラウザにリロードを命令する方法が無いのか、ヘッダを見なおしてみた。
- retry-after ヘッダ
- refresh ヘッダ
この2つのヘッダが定義されていることがわかる。
retry-after はブラウザ実装が微妙
retry-after はまさにバッチ処理の為に作られたようなHTTPヘッダなのだが、これを見てるのはGoogleBotくらいらしい。
もし使うとしたら、 202 Accepted
や 503 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(){}" />