3

jsonpを使用した外部PlayへのAJAXリクエスト!1.2.4データを正常に返すHerokuのアプリケーションは、にnullを返しますgetResponseHeaders()

これが私のコードです:

var ajaxresult;
    ajaxresult = $.ajax({
    'complete': function (jqXHR, status) {            
        console.log('Complete!');
        console.log(status);
        console.log("on compelte: " + jqXHR.getAllResponseHeaders());
    },
    'dataType': "jsonp",
    'error': function (jqXHR, status, error) {
        console.log('Error!');
        console.log(status);
        console.log(error);
        console.log("on error: " + jqXHR.getAllResponseHeaders());
    },
    'success': function (data, status, jqXHR) {
        console.log('Success!');
        console.log(status);
        console.log(data);
        console.log("on success: " + ajaxresult.getAllResponseHeaders());
        console.log("on success(2): " + jqXHR.getAllResponseHeaders());
    },
    'type': 'GET',
    'url': url + "findAllSpecials"
});

jqXHRの内容をダンプすると、次のようになります。

"readyState: 4","setRequestHeader: function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this}","getAllResponseHeaders: function(){return s===2?n:null}","getResponseHeader: function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c}","overrideMimeType: function(a){s||(d.mimeType=a);return this}","abort: function(a){a=a||\"abort\",p&&p.abort(a),w(0,a);return this}","done: function(){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this}","fail: function(){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this}","progress: function(){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this}","state: function(){return e}","isResolved: function(){return!!i}","isRejected: function(){return!!i}","then: function(a,b,c){i.done(a).fail(b).progress(c);return this}","always: function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this}","pipe: function(a,b,c){return f.Deferred(function(d){f.each({done:[a,\"resolve\"],fail:[b,\"reject\"],progress:[c,\"notify\"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+\"With\"](this===i?d:this,[g])}):i[a](d[e])})}).promise()}","promise: function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}","success: function(){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this}","error: function(){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this}","complete: function(){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this}","statusCode: function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this}","status: 200","statusText: success"]

OperaとFirefoxで見られる応答ヘッダーは次のとおりです。

HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Type: text/plain; charset=utf-8
Server: Play! Framework;1.2.4;prod
Set-Cookie: PLAY_FLASH=;Expires=Fri, 5-Oct-12 12:47:15 GMT;Path=/
Set-Cookie: PLAY_ERRORS=;Expires=Fri, 5-Oct-12 12:47:15 GMT;Path=/
Set-Cookie: PLAY_SESSION=...
Content-Length: 1290
Connection: keep-alive

getAllReponseHeaders()ブラウザがヘッダーを認識できるのに、usingがnullを返すのはなぜですか?クロスドメインリクエストは、レスポンスヘッダーがAJAXレスポンスに送信されるのを防ぎますか?

すべての助けを歓迎します。

ありがとう!

4

2 に答える 2

5

ほとんどのブラウザ(Mozilla、Safari、Chrome)はまだサポートされていないAccess-Control-Expose-Headersため、動作しませんgetAllReponseHeaders()

これは、mozillafirefoxフォーラムのバグとして提起されました。しかし最近彼らはここで修正を持っていますあなたがそれをチェックすることができるリンクですこれ

于 2012-10-05T13:39:59.100 に答える
3

サーバーは、ここでAccess-Control-Expose-Headers定義されているように、読み取ることができるヘッダーのホワイトリストを含むヘッダーを返す必要があります。

このヘッダーはFirefox18とChrome24で使用できました。少なくともこのサイトによると、ここではブラウザのサポートは問題ではないと思います。

「プリフライト」リクエストからのOPTIONSメソッドだけでなく、GET(またはPOST、PUT、DELETE)の応答内でこのヘッダーを返すようにしてください。

于 2013-02-11T20:33:44.683 に答える