AndroidでTitanium.Network.HTTPClientを使うとUAがセットされない
Titanium.Network.HTTPClientで嵌りました。
Yahoo!のAPIを使ってデータを取ってくる処理を書いていたのですが、iPhoneでは動くのにandroidで動かないという現象が発生しました。
onerrorでエラー内容を見ると「Bad Request」とのこと。
試しにはてなやATNDなどの他のAPIを利用してみると正常にレスポンスが返ってきました。
どうやらなんらかの理由でYahoo!のみBad Requestを返すようです。
TITANIUM BBS(JP UNOFFICIAL)でもらったアドバイスに従ってリクエスト先をローカルのCatalystに変更してヘッダーをダンプしてみると、下記のようにandroidの場合だけUser Agentを送信していないことが分かりました。
#Chrome $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' ); #iOSシミュレータ $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' ); #androidエミュレーター $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さん、ありがとうございました!