XMLHttpRequestとリクエストヘッダ
バックエンドシステム側で、XMLHttpRequestによるリクエストなのか、通常のリクエストなのかを判別したい時がある。処理内容は全く同じだが、XMLHttpRequestによるリクエストなら画面再描画が不要で、必要なデータだけちょろっと返すだけで良く、それをスマートに切り替えたい。
JavaScriptでリクエストにちょっと細工(クエリパラメータを足しておくとか)すればいいのだけれど、本当はもっときれいにやりたい。Railsだとxhr?とかいうのがあって…みたいな事もあり、それをかなえるカラクリも存在している筈。
と思って探してみたのだけれど、なかなかそういう記述を見つけられないでいた。で、探すのが面倒になってリクエストヘッダのダンプを調べた。
#!/usr/bin/perl use strict; use warnings; use CGI::Carp qw(fatalsToBrowser); print "Content-Type: text/plain;charset=utf-8?n?n"; print '<h1>ENVIRONMENT</h1>'; print '<table>'; while ( my ( $key, $value ) = each %ENV ) { printf '<tr><th>%s</th><td>%s</td></tr>', $key, $value; } print '</table>'; exit;
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <meta http-equiv="Content-Type-Script" content="text/javascript" /> <script type="text/javascript" src="/js/prototype.js"></script> <title>TEST</title> </head> <body> <h1>TEST</h1> <form action="/misc/header.cgi" method="post" id="test-form"> <div><input type="text" name="key1" value="key1" /></div> <div><input type="text" name="key2" value="key2" /></div> <div><input type="submit" value="submit" /></div> </form> <div id="response">response</div> <script type="text/javascript"> Event.observe( window, 'load', function(){ Event.observe( 'test-form', 'submit', function(){ new Ajax.Request( '/misc/header.cgi', { method: 'post', parameters: Form.serialize('test-form'), onSuccess: function( transport ){ $('response').innerHTML = transport.responseText; }, onFailure: function(){ $('response').innerHTML = 'failure'; } } ); }); $('test-form').onsubmit = function(){ return false; }; }); </script> </body> </html>
テスト用にしては(いらんところが)豪華だけれど、まぁ適当に。
で。それっぽいのは以下。
HTTP_X_REQUESTED_WITH | XMLHttpRequest
これで判別しているんだね。確かにHTTP_X_REQUESTED_WITHで検索をかけると、多少は結果が返ってくる。(セカンドライフのとかね…。)このヘッダのことをもっと宣伝してくれ!と思った。