Titanium.Network.HTTPClientで嵌りました。
Yahoo!のAPIを使ってデータを取ってくる処理を書いていたのですが、iPhoneでは動くのにandroidで動かないという現象が発生しました。
onerrorでエラー内容を見ると「Bad Request」とのこと。
試しにはてなやATNDなどの他のAPIを利用してみると正常にレスポンスが返ってきました。
どうやらなんらかの理由でYahoo!のみBad Requestを返すようです。
TITANIUM BBS(JP UNOFFICIAL)でもらったアドバイスに従ってリクエスト先をローカルのCatalystに変更してヘッダーをダンプしてみると、下記のようにandroidの場合だけUser Agentを送信していないことが分かりました。
$VAR1 = bless( {
'accept-charset' => 'Shift_JIS,utf-8;q=0.7,*;q=0.3',
'user-agent' => 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16',
'connection' => 'keep-alive',
'cache-control' => 'max-age=0',
'accept' => 'application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5',
'accept-language' => 'ja,en-US;q=0.8,en;q=0.6',
'accept-encoding' => 'gzip,deflate,sdch',
'host' => 'localhost'
}, 'HTTP::Headers' );
$VAR1 = bless( {
'user-agent' => 'Appcelerator Titanium/1.6.1 (iPhone Simulator/4.2; iPhone OS; en_US;)',
'connection' => 'keep-alive',
'accept-encoding' => 'gzip',
'x-requested-with' => 'XMLHttpRequest',
'host' => 'localhost'
}, 'HTTP::Headers' );
$VAR1 = bless( {
'user-agent' => '',
'connection' => 'Keep-Alive',
'x-requested-with' => 'XMLHttpRequest',
'host' => 'localhost'
}, 'HTTP::Headers' );
他にもandroidの場合だけセットされていない値がありましたが、一番怪しいと思われるUserAgentを下記のように自分でセットしてからリクエストを送信すると、ようやくYahoo!からもレスポンスが返ってきました!
xhr.open('GET',url);
xhr.setRequestHeader('User-Agent',Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A537a Safari/419.3');
xhr.send();
ちなみにUAの値は"hoge"とかでも大丈夫だったので、Yahoo!のAPIはUserAgentに値があるかどうかだけチェックしているようです。
BBSで質問した経緯は下記に。
AndroidでTitanium.Network.createHTTPClient.onloadなどが実行されない
Androidの場合だけTitanium.Network.HTTPClientがUserAgentなどのヘッダをセットしてくれないようです。Yahoo!に限らず、UAをチェックするサービスはたくさんあると思うので気を付けないといけないですね。
TwitterやBBSで返信いただいた@masuidriveさん、@24okさん、ありがとうございました!