2017-02-26 1 views
0

Ich habe die folgende Javascript-App, die Daten von GCDWebServer empfängt, die auf einer OSX-App ausgeführt wird.GCDWebServer gibt HTTPRequest Status Null ohne Antwort zurückText

var HttpClient = function() { 
     this.get = function(aUrl, aCallback) { 
      var anHttpRequest = new XMLHttpRequest(); 
      anHttpRequest.open("GET", aUrl, true); 
      anHttpRequest.onreadystatechange = function() { 
       if (anHttpRequest.readyState == 4 && anHttpRequest.status == 200) { 
        aCallback(anHttpRequest.responseText); 
        document.write (anHttpRequest.responseText); 
        } 
        else { 
        document.write ("Not Ok: ReadyState=" + anHttpRequest.readyState + " Status= " + anHttpRequest.status); 
        } 
      }  
      anHttpRequest.send(null); 
     } 
    } 

    var client = new HttpClient(); 
    client.get('http://xxx.xxx.x.xx:8080?var=param', function(response) { 
     document.write ("Success"); 
    }); 

Die Cocoa-Anwendung läuft den folgenden Code:

[webServer addDefaultHandlerForMethod:@"GET" 
          requestClass:[GCDWebServerRequest class] 
         asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) { 

          dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
           GCDWebServerDataResponse* response = [GCDWebServerDataResponse responseWithJSONObject:dict]; 
           completionBlock(response); 
          }); 

ich immer ein anHttpRequest.readyState = 4 und anHttpRequest.status bekommen = 0. Die anHttpRequest.responseText leer ist.

Allerdings, wenn ich einen Browser öffnen und http://xxx.xxx.x.xx:8080?var=param eingeben, bekomme ich die richtigen Ergebnisse. Also sendet der Server die Daten richtig. Hier

ist das Protokoll von GCDWebServer

[DEBUG] Did open connection on socket 13 
[DEBUG] Did connect 
[DEBUG] Connection received 312 bytes on socket 13 
[DEBUG] Connection on socket 13 preflighting request "GET /" with 312 bytes body 
[DEBUG] Connection on socket 13 processing request "GET /" with 312 bytes body 
[DEBUG] Connection sent 175 bytes on socket 13 
[DEBUG] Connection sent 107 bytes on socket 13 
[DEBUG] Did close connection on socket 13 
[VERBOSE] [xxx.xxx.x.xx:8080] xxx.xxx.x.xx:52401 200 "GET /" (312 | 282) 
[DEBUG] Did disconnect 

Irgendwelche Ideen? Vielen Dank im Voraus.

Antwort

1

Dies ist kein Problem mit Ihrem GCDWebServer, sondern einfach ein CORS-Problem. Wenn Sie die gleiche Anfrage an Ihren Server von etwas wie curl stellen, dann sehen Sie den korrekten 200 HTTP-Status. Um die richtige Antwort von einem Browser zu bekommen müssen Sie Ihren Server senden, um die folgenden Header haben:

Access-Control-Allow-Origin: * 

Dieser den Browser mitteilt, dass es erlaubt ist, die vollständige Antwort, die er von dem Server an die JavaScript wird passieren zurück Initiieren die Anfrage. Ohne diesen Antwortkopf löscht der Browser im Wesentlichen alle empfangenen Daten und sollte eine Fehlermeldung in der Konsole Ihres Browsers ausgeben.

+0

Vielen Dank. Es funktionierte. Ich musste nur hinzufügen [response setValue: @ "*" fürAdditionalHeader: @ "Access-Control-Allow-Origin"]; Nach der Antwort GCDWebServerDataResponse * ... und vor dem completionBlock (Antwort); –

Verwandte Themen