QA@IT

Androidのアプリブラウザからjqueryで$.ajaxを使うとメソッドがOPTIONSになる

11377 PV

Androidの端末は京セラのKYL22です。
DocomoのGalaxyS4 SC-04Eでも同じ事が発生します。

Androidのアプリ内のブラウザから、jquery2.1.1でajaxを実行して、APIを呼びだそうとしました。失敗しました。

apacheのログには、以下のように「OPTIONS」というメソッドで記載されます。
999.999.999.999 - - [27/Jun/2014:16:46:46 +0900] 0 "OPTIONS APIのパス HTTP/1.0" 403 223 "-" "アプリのUA"

普通は以下のようにpostとなるはずです。
999.999.999.999 - - [27/Jun/2014:16:46:46 +0900] 0 "POST APIのパス HTTP/1.0" 403 223 "-" "アプリのUA"

ajaxの実行方法はこんな感じです。

var opt = {
            type: "post",
            url: sampleUrl,
            data: {},
            cache: false,
            dataType: 'json',
            headers: {
                            'X-CSRF-Token'  : $('#token').val()
                    }
};

$.ajax(
     opt
).done(function(data){
    if(data.status=="SUCCESS"){
            //成功
            //画面遷移を行う。
            location.href = "遷移先のURL";
    }else{
            //失敗
            alert(data.messages);
    }
}).fail(function(){
    return function(){
            alert(errMsg);
            return false;
    }
});

英語のサイトでは、
http://stackoverflow.com/questions/1099787/jquery-ajax-post-sending-options-as-request-method-in-firefox
こんな所もあるのですが、解決策がよくわかりません。
他のブラウザでは正常に動くので、ブラウザに依存している問題なのかもと考えたのですが、それでは他の場所でajaxが動く事の説明がつきません。

何が問題なのでしょうか。どうすれば解決できるのでしょうか?

回答

他のブラウザでは正常に動くというのがわかりませんが、CORS(Cross-Origin Resource Sharing) の preflight ではないでしょうか?

クロスドメインで、かつ、独自のヘッダ X-CSRF-Token が含まれているためだと思うので、その Android 端末でのみクロスドメインになっているとかではないでしょうか?

編集 履歴 (0)
  • まさにクロスドメインの問題でした。
    ajaxで投げるURLを相対パスにする事で解決致しました。
    ありがとうございました。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。