Jquery .ajax获取请求总是失败

时间:2014-10-03 13:12:51

标签: jquery json http

除了失败之外,我无法获得此请求。我已经使用curl和Web开发人员工具栏来检查创建的URL,WD总是说响应正确地返回为200.我已经尝试将内容类型更改为text,octet-stream并将其注释掉。我还采用了JSON响应并使用JSONLint对其进行了验证。

我使用的代码就是这个;

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <link rel="stylesheet" type="text/css" href="css/testing.css">
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js" ></script>
    <script type="text/javascript">
    $(function(){
        $("body").append("<p>Testing.....</p>");
        var test= {latitude:"37.0205",longitude:"-7.969141667",startDate:"09-01-2014",endDate:"09-02-2014"};
        var url="<hidden>";

        $.ajax({
            url : url,
            type: "GET",
            data : test,
            dataType:"json",
            contentType:"application/json",
            success: function(data,status)
            {
                $("body").append("<p>Success"+JSON.stringify(data)+"</p>");
                $("body").append("<p>Success"+status+"</p>");
            },
            error: function (jqXhr,textStatus,errorThrown)
            {
                $("body").append("<p>Failure " + JSON.stringify(jqXhr)+"----- "+ textStatus+ "----- "+ errorThrown+"</p>");
            }
        });
        $("body").append("<p>input"+JSON.stringify(test)+"</p>");
    });
    </script>
</head>
<body>
    <h1>Weather test</h1>

</body>
</html>

错误功能在我的网络浏览器中的输出是&#34;失败{&#34; readyState&#34;:0,&#34; responseText&#34;:&#34;&#34;,& #34; status&#34;:0,&#34; statusText&#34;:&#34;错误&#34;} -----错误-----&#34;

标题的格式为

  

HTTP / 1.1 200 OK Cache-Control:private,max-age = 0服务器:   Microsoft-IIS / 7.5 X-AspNet-Version:4.0.30319 X-Powered-By:ASP.NET   日期:星期五,03十月2014 11:57:47 GMT内容 - 长度:25328

并使用curl -ivs --raw来获取具有所有适当的get参数的url。在此之后直接跟随有效的JSON。我担心没有内容类型可能会抛出这个。

我知道还有很多其他类似的问题,但是我已经尝试过先解决这些问题并应用所吸取的教训。如果您有任何其他建议,我将非常感激。

谢谢,

2 个答案:

答案 0 :(得分:7)

正如您所写,I'm running the web-page on a server on my home machine and the url is for a different, external server not under my control.

这通常意味着Same origin policy规则适用于此。

它不允许您轻松发送cross-domain ajax request

如果您确实需要发送跨域ajax请求,请查看JSONPCORS

答案 1 :(得分:1)

如果你能够使用curl检索url,但是你的ajax调用在浏览器中返回错误,这意味着url不支持CORS(Cross-origin resource sharing)并返回没有Allow-Control-Allow的响应头 - 您域名的原始许可。

由于网址是针对不受您控制的其他外部服务器,因此您无法启用Allow-Control-Allow-Origin标头,因此无法在客户端/ javascript级别正确解决此问题。

但是,如果您可以在服务器上创建一个使用curl检索外部URL的PHP​​脚本,并修改您的ajax来调用该PHP脚本,那么解决方案很简单。通过这种方式,您的ajax会调用本地URL,并且不再存在跨域问题。

您可以创建PHP脚本并将其命名为“local.php”,将“your_external_url”替换为您的网址:

<?php
$url = 'your_external_url';
$ch =  curl_init($url.'?'.$_SERVER['QUERY_STRING']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
echo $result;
?>

并将您的ajax网址修改为“local.php”:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <link rel="stylesheet" type="text/css" href="css/testing.css">
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js" ></script>
    <script type="text/javascript">
    $(function(){
        $("body").append("<p>Testing.....</p>");
        var test= {latitude:"37.0205",longitude:"-7.969141667",startDate:"09-01-2014",endDate:"09-02-2014"};
        var url="local.php";

        $.ajax({
            url : url,
            type: "GET",
            data : test,
            dataType:"json",
            contentType:"application/json",
            success: function(data,status)
            {
                $("body").append("<p>Success"+JSON.stringify(data)+"</p>");
                $("body").append("<p>Success"+status+"</p>");
            },
            error: function (jqXhr,textStatus,errorThrown)
            {
                $("body").append("<p>Failure " + JSON.stringify(jqXhr)+"----- "+ textStatus+ "----- "+ errorThrown+"</p>");
            }
        });
        $("body").append("<p>input"+JSON.stringify(test)+"</p>");
    });
    </script>
</head>
<body>
    <h1>Weather test</h1>

</body>
</html>