2013-03-13 11 views
7

Ich brauche Zugriff auf die Größe der Antwort Nachricht, die ich von einem anderen Rechner (domänenübergreifende Anfrage) mit $ .getJSON, obwohl ich die Anfrage und Antwort in Chrome-Konsole, es sehen kann funktioniert nicht. Hier ist mein Anforderungscode:Wie bekomme ich 'getJSON' Antwort Header

xhr=$.getJSON('http://192.168.1.102/server/server.php?callback=?', 
{data:array}, function(res){ 
alert(xhr.getAllResponseHeader()); 
}, 
type='json'); 

beim Laufen bekomme ich „Uncaught Typeerror: Objekt hat keine Methode‚getAllResponseHeader‘“ Fehler. Wenn ich

alert(xhr.getResponseHeader("Content-Length")); 

verwende, bekomme ich "null".

Bitte beachten Sie, dass ich Cross-Domain-Get.

+2

Die richtige Methode Name ist 'getAllResponseHeaders'. – Andrei

+1

Für Cross-Domain verwendet es wahrscheinlich JSONP. und ihr Dokument sagt 'Da jedoch JSONP und domainübergreifende GET-Anforderungen kein XHR verwenden, sind in diesen Fällen die Parameter jqXHR und textStatus, die an den Erfolgsrückruf übergeben werden, undefiniert. ' – HungryCoder

+0

1- @Andrei: Danke für" s "du bist richtig, wenn ich xhr.getAllResponseHeaders() alarmiere; es gibt nichts zurück, nicht einmal null. – Espanta

Antwort

0

Ich beobachtete viele Besuche zu dieser Frage und dachte, dass es gut ist, die Lösung für dieses Problem bereitzustellen. Leider hat keine der angebotenen Lösungen funktioniert und ich habe zwei Dinge getan, um das Problem zu lösen.

  1. ich festgestellt, dass ich die folgenden Codes direkt nach dem <?php Tag in meiner Server-Seite:

    header("Content-Type: application/*"); 
    header("Access-Control-Allow-Origin :*"); 
    header("Access-Control-Allow-Methods: POST, GET, OPTIONS"); 
    header("Access-Control-Max-Age: 1000"); 
    header("Access-Control-Allow-Headers: Content-Type"); 
    
  2. ich leicht die Art und Weise änderte ich den Anruf wie folgt tun und es funktioniert immer für mich .

    function name(){ 
        $.ajax({ 
         type: 'POST', 
         crossDomain: true, 
         data: { 
          data1: data 
         }, 
         dataType: 'text', 
         error: function (res, textStatus, errorThrown) { 
          alert('Connection Terminated. Please try again'); 
         }, 
         success: function(res, textStatus, jqXHR) { 
         //Process the result in res; 
         }, 
        });//ajax 
    }//function name 
    
0

Try this:

xhr=$.getJSON('http://192.168.1.102/server/server.php?callback=?', 
    {data:array}, function(res,status,xhr){ 
    alert(xhr.getAllResponseHeaders()); 
    // not getAllResponseHeader its only getResponseHeader 
}); 

Für cross domain Verwendung

$.ajax({ 
    url: 'http://192.168.1.102/server/server.php?callback=?', 
    dataType: 'json', 
    jsonpCallback: 'MyJSONPCallback', // specify the callback name if you're hard-coding it 
    success: function(data){ 
    // we make a successful JSONP call! 
    } 
}); 

Siehe dieses jQuery getJSON works locally, but not cross domain

Docs Für getAllResponseHeaders, getResponseHeader und ajaxhttp://api.jquery.com/jQuery.ajax/

+0

danke Rohan, ich habe ein Indexed Array von Nummer, um th den Server zu senden. Ist in Ordnung, wenn ich Daten senden: Array. Wenn dies geschieht, wird der Header der Anfrage voll mit undefined = & ... server/server.php? Callback = callback & undefined = & undefined = & undefined = & undefined. Ich denke, meine Daten sollten in Form von Schlüssel/Wert vorliegen, also habe ich Daten: {1: 123} und gesendet, aber ich bekomme nie eine Antwort. – Espanta

+0

Der erste Codeblock ist verwirrend: Er verwendet 'getAll ...', aber der Kommentar sagt, dass er nicht verwendet werden soll. –

3

Verwenden Sie JSONP nicht, es ist nicht wirklich eine domänenübergreifende Anfrage (JSONP explained), es ist ein Hack, der nur für GET-Anfragen funktioniert, während AJAX jede http-Methode erlaubt.

Versuchen Sie, Ihren Server Vorbereitung Cross-Domain-Anfragen (more details) zu ermöglichen, und dies zu tun:

$.ajax({ 
type: "get", 
url: "http://192.168.1.102/server/server.php", 
crossDomain: true, 
cache: false, 
dataType: "json", 
contentType: "application/json; charset=UTF-8", 
data: array, 
success: function(data, textStatus, xhr) { 
    console.log(data); 
    console.log(xhr.getResponseHeader("Content-Length")); 
}, 
error: function (xhr, textStatus, errorThrown) { 
    console.log(errorThrown); 
}}); 

Dadurch wird das XHR-Objekt festgelegt und Sie können es Header zugreifen.

+0

danke vhtc, ich werde es bald versuchen. Kann ich POST auch mit diesem Ansatz machen? Ich benutze Apache Tomcat, ist es dann okay? – Espanta

+0

Sie können HTTP-Anfragen eines beliebigen Typs eingeben. – vhtc

+2

Auf der Serverseite müssen Sie der Antwort den Header Access-Control-Allow-Origin hinzufügen. – vhtc