21

REST サービスを使用して、ユーザーにダウンロードを促す CSV ファイルを生成しています。サービスの一例は以下の通りです。

https://localhost:8444/websvc/exportCSV?viewId=93282392

ユーザーにファイルのダウンロードを促すには、次のコードを使用します。

window.location.href = exportUrlexportUrl上記のような URL になります。

サービスの実行時にサーバーにエラーがない場合、これはうまく機能します。ファイルのダウンロード プロンプトが表示され、ページが更新されず、すべて問題ありません。

ただし、エラー発生した場合、厄介な HTTP ステータス 500 ページが表示され、ユーザー エクスペリエンスに悪影響を及ぼします。私がやりたいことは、結果のページでエラーをキャッチし、現在のページを離れることなく、よりわかりやすいエラーをスローすることです。私は試した:

try {
    window.location.href = exportUrl;
}
catch (e) {
    alert(e);
}

しかし、それは動作をまったく変更していないようです。これを処理する方法について誰かアイデアがありますか?

どうもありがとう。

4

1 に答える 1

11

このようなエラーをキャッチすると、JavaScript エラーのみがキャッチされます。それはあなたがここで経験していることではありません。サーバーが のステータス コードを返しています500。ユーザーをそこに送る前に、すべてが適切であることを確認する必要があります。

そのためには、Ajax で URL を効果的に「ping」して、500 エラーが返されないようにすることができます。

次のようなもの:

var xhr = new XMLHttpRequest();

xhr.onreadystatechange = function() {
    if(xhr.readyState == 4 && xhr.status == 200) {
        window.location.href = exportUrl;
    }
}

xhr.open('head',exportUrl);
xhr.send(null);

これにより、厄介なサーバー エラーが待機していないことを確認するために、URL への HEAD 要求が行われます。

もちろん、実際に CSV を生成する過程でサーバーがエラーをスローした場合、それでも 500 が返されます。

より堅牢な方法は、Ajax 経由でデータを取得し、経由してデータ URL を構築し、そのデータ URLbase64encodeに設定window.location.hrefすることです。

そうすることで、Ajax が 500 を返さず、期待どおりのデータを応答で取得できることを確認することもできます。

お役に立てれば!

于 2013-09-19T16:19:40.587 に答える