2017-02-26 27 views
0

我有以下JavaScript應用程序從GCDWebServer接收運行在OSX應用程序的數據。GCDWebServer返回HTTPRequest狀態零沒有響應文本

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

的可可應用程序運行以下代碼:

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

我總是得到一個anHttpRequest.readyState = 4和anHttpRequest.status = 0。anHttpRequest.responseText是空的。

但是,當我打開任何瀏覽器並鍵入http://xxx.xxx.x.xx:8080?var=param我得到正確的結果。所以服務器正在正確地發送數據。

這裏是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 

任何想法日誌? 在此先感謝。

回答

1

這不是你的GCDWebServer的問題,而只是一個CORS問題。如果你從curl這樣的東西對你的服務器發出同樣的請求,那麼你會看到正確的200 HTTP狀態。爲了從一個瀏覽器,您需要在您的服務器發送下面的標題正確的響應:

Access-Control-Allow-Origin: * 

這樣可以讓被允許回傳從你的服務器的JavaScript發起全力應對它得到瀏覽器請求。如果沒有該響應頭,瀏覽器就會丟棄所有收到的數據,並在瀏覽器的控制檯中輸出錯誤消息。

+0

謝謝。有效。我只需要添加 [response setValue:@「*」forAdditionalHeader:@「Access-Control-Allow-Origin」]; 之後GCDWebServerDataResponse *響應...和completionBlock(響應)之前; –