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で検索をかけると、多少は結果が返ってくる。(セカンドライフのとかね…。)このヘッダのことをもっと宣伝してくれ!と思った。