2014-01-31 86 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]”来禁用缓存。