2011-03-17 12 views
6

JSONP表記を使用してクライアントに応答する方法を知っているJavaScriptクライアントとサーバーの間の通信に依存するアプリケーションを実装しています。4xxまたは5xx HTTPエラーコードが存在する場合のJavascriptによるJSONP応答の解析

私のサーバーがhttpステータスコード4xxまたは5xxを返すJavascriptクライアントでこのケースを処理しようとしています。現在私が見ているのは、ブラウザがエラーであると信じているのでスクリプトが評価されないということです(しかし、それはあります)。しかし、私はこの4xxまたは5xxのレスポンスが発生したときに、私のJavaScriptクライアントのコード。

これはスクリプトタグ要素でエラーが発生するのを見ていますが、これはクロスブラウザではなく、堅牢なソリューションではないことに懸念しています。

httpステータスコードが4xxまたは5xxであっても、誰かがまだjsonp応答を解析していることはありますか?

私は、jsonp要求に対するコールバック関数が特定の時間枠内で完了することを示すことによって、失敗を「検出」するこの「タイムアウトを設定する」ソリューションを使用する必要があると考え始めています。 、エラーが発生しました。

EDIT:サーバーがjsonpクライアントを検出し、jsonオブジェクトのエラーメッセージ/ステータスをトンネリングしたときに、一時的に常にステータスコード200が返されます。私はHTTPのステータスコードを利用することを望んでいたが、私はそれがjavscriptクライアントのためのものではないと思っている。

答えて

7

JSONPを使用する場合の1つのアプローチは、ステータス情報をコールバックに埋め込むことです。あなたの呼び出しが

fn({"data":"my great data"}, 200) 

のように見えるの呼び出しが成功するためと例外条件

用のコードを生成

http://myurl.com/?callback=fn 

のように見えるのであれば、コールバック関数のシグネチャだから

callback(result, status, message) 

ようになります。

fn(null, 500, "server error"} 
+0

Lumen/Laravelプロジェクトを使ってこれがどのように達成されるかについてのご意見はありますか? – jtanmay

-3

XHRオブジェクトのstatusを確認できます(JSライブラリを使用していない場合)。あなたはjQueryのを使用している場合

if(xhr.readyState == 4){ 
    if(xhr.status == 200){ 
    // good 
    }else if(xhr.status == 502){ 
    // d'oh 
    } 
} 

、あなたは$.ajax

+1

私はusinですg JSONPはクロスドメインの制限をバイパスします。 http://en.wikipedia.org/wiki/JSON#JSONPセクション8。1 –

+1

@Macy私はいくつかの睡眠が必要なように見える:pとにかく、そこに同様の議論がある[ここ](http://stackoverflow.com/questions/1002367/jquery-ajax-jsonp-ignores-a-timeout-and-doesnt-火災のエラーイベント)。 – Haochi

+0

クール、そのリンクのおかげで –

8

JSONPが動作し、周りへのクロスドメインの問題をハックあるため、特殊なケースを処理するためにstatusCodeに渡すことができます。それがうまくいくとうまくいく。しかし、それはあなたが何がうまくいかなかったかを把握する方法がありません。

setTimeoutは元のものの上に別のハックです。 JSONPを使用しなければならず、エラー検出(処理ではありません)が必要な場合は、何をする必要があるのでしょうか。より良い解決策はありません。

サーバーを制御する場合は、クロスドメインリソース共有(CORS)やFlashのcrossdomain.xmlなどの代替ドメインを使用してドメイン間の要求を許可してください。サーバーを制御しない場合は、サーバーを介して応答をプロキシして、より良い制御を得ることができます。

+0

CORSのクロスブラウザサポートが不足していますか? http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing –

+1

これは大きな問題ですが、他のすべての解決策もそうです。 CORSは、ほとんどの新しいブラウザ(モバイルSafariを含む)で動作しますが、古いブラウザでは動作しません。 Flashはデスクトップ上では普遍的ですが、モバイルデバイスでは動作しません。サーバー側のプロキシはどこでも動作しますが、余分な作業が必要です。 JSONPにはエラー処理がありません。より悪いものを選んでください。 –

関連する問題