Question

An AJAX request, using jsonp, to an external Play! 1.2.4 application on Heroku, which returns data successfully, returns null ongetResponseHeaders().

Here is my code:

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"
});

If I dump the contents of jqXHR, I get:

"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"]

The response headers as seen in Opera and Firefox are:

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

Why is is that using getAllReponseHeaders() returns null when the browser can see the headers? Does cross domain requests prevent response headers from being sent to the AJAX response?

All help is welcome.

Thanks!

Était-ce utile?

La solution

i'm afraid that most of the browser's (Mozilla,Safari,Chrome) does not yet support Access-Control-Expose-Headers so your getAllReponseHeaders() will not work..

its been raised as a bug in mozilla firefox forums. But recently they have a fix here is the link you can check it out This

Autres conseils

Your server should return the Access-Control-Expose-Headersheader with the whitelist of headers that can be read, as defined here.

I was able to use this header with Firefox 18 and Chrome 24. I think browser support is not a problem here, at least according to this site.

Be sure to return this header within the response of your GET (or POST, PUT, DELETE), not just with the OPTIONS method from "preflighted" requests.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top