2014-01-31 83 views
0

我有返回JSON數據的服務:http://api.drag2droid.shamanland.com/captcha?base64AJAX請求失敗原因不明(jQuery的)

我試圖執行簡單的AJAX請求:

$.ajax({ 
    type: "get", 
    url: "http://api.drag2droid.shamanland.com/captcha?base64", 
    dataType: "json", 
    success: function(data) { 
     $("body").html(data); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     $("body").html("ajax failed: " + textStatus + ", " + jqXHR.status + " " + errorThrown); 
    } 
}); 

結果是:

ajax failed: error, 0 

但是,如果我只是將這個URL粘貼到我的瀏覽器的地址欄中,我可以看到JSON響應。

有人知道可能的陷阱嗎?

的jsfiddle:http://jsfiddle.net/shomeser/n5TjL/

編輯:

其實,我已經設置了我的服務器端允許來自任何域的任何標題,PHP代碼的所有請求:

if ($_SERVER["REQUEST_METHOD"] == "OPTIONS") { 
    header("Access-Control-Allow-Origin: *"); 
    header("Access-Control-Allow-Credentials: true"); 
    header("Access-Control-Max-Age: 86400"); 
    header("Access-Control-Allow-Methods: GET, POST, PUT, OPTIONS"); 

    if (isset($_SERVER["HTTP_ACCESS_CONTROL_REQUEST_HEADERS"])) { 
     header("Access-Control-Allow-Headers: {$_SERVER["HTTP_ACCESS_CONTROL_REQUEST_HEADERS"]}"); 
    } 

    exit(0); 
} 

編輯:

在冷杉的網絡選項卡ebug插件我可以看到沒有檢索到內容: enter image description here

但是直接從瀏覽器獲取GET請求會顯示完整內容。

+1

檢查你的開發工具,網絡選項卡,並查看請求後, ajax調用失敗了。如果它的跨域問題,你的控制檯應該有一些錯誤。 –

+0

您是否在同一個域上運行該網站和API?我相信你知道AJAX調用不能跨域使用。爲此你必須使用'JSONP' –

回答

1

謝謝大家,夥計們,我發現我的問題。在我從this post複製粘貼代碼PHP後,我決定優化它 - 我將所有語句放入if METHOD == OPTIONS。這是錯誤的。

標題Access-Control-Allow-Origin應該不僅返回OPTIONS請求。

我更新的代碼工作正常:

if (isset($_SERVER["HTTP_ORIGIN"])) { 
    header("Access-Control-Allow-Origin: {$_SERVER["HTTP_ORIGIN"]}"); 
} 

if ($_SERVER["REQUEST_METHOD"] == "OPTIONS") { 
    if (isset($_SERVER["HTTP_ACCESS_CONTROL_REQUEST_METHOD"])) { 
     header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); 
    } 

    if (isset($_SERVER["HTTP_ACCESS_CONTROL_REQUEST_HEADERS"])) { 
     header("Access-Control-Allow-Headers: {$_SERVER["HTTP_ACCESS_CONTROL_REQUEST_HEADERS"]}"); 
    } 

    exit(0); 
} 

由於@Patrick埃文斯第二個評論,但它已經被刪除=)

-1

原因是因爲CORS(即跨域問題)。爲了克服使用jsonp而不是json。

dataType: "jsonp", 
0

當我們給類型爲「JSON」,響應應該是一個嚴格的JSON對象。請驗證回覆或在此處發佈。

見從URL中摘錄如下:JQuery API

「JSON」:評估響應爲JSON,並返回一個JavaScript對象。 JSON數據嚴格分析;任何格式不正確的JSON都會被拒絕並引發解析錯誤。從jQuery 1.9開始,一個空的響應也被拒絕;服務器應該返回null或{}的響應。 (有關正確的JSON格式的更多信息,請參閱json.org。)

「jsonp」:使用JSONP加載JSON塊。添加額外的「?callback =?」到您的URL的末尾來指定回調。除非緩存選項設置爲true,否則通過向URL追加查詢字符串參數「_ = [TIMESTAMP]」來禁用緩存。