Jquery AJAX POST 调用返回 200 状态码但出现错误

8

你好,我实现了一个Ajax POST请求来调用Web服务。它总是返回200 OK,但执行失败事件。我尝试了很多事情,但我不知道我的错误在哪里。我在这里添加了我的代码。 Fiddler显示响应内容,但Ajax没有执行成功事件。

<!DOCTYPE html>
<html><head>
<script src="http://code.jquery.com/jquery-1.7.1.min.js" type="text/javascript"></script>
</head>
<body>
<script type="text/javascript">

$.ajax({
    type: "POST",
    url: url,
    data: values,
    dataType: 'json',
    cache: false,
    success: function (result) {
        alert("success:"+result);
    },
    error:function (error) {
        alert("error"+error);
    }
});
</script>
</body>
</html>

我尝试过使用dataType:'text'....服务器响应的数据格式是正确的JSON格式。

请求的JSON数据:

{
    "search": {
        "params_attributes": {
            "adults": "1",
            "children": "0",
            "depart_date": "2013-07-10",
            "destination_name": "OMS",
            "direct": "0",
            "infants": "0",
            "origin_name": "KUL",
            "range": "0",
            "trip_class": "0"
        }
    },
    "signature": "XXXXXXXX",
    "marker": "XXX"
}

响应的 JSON 数据:

{
    "search_id":"66",
    "metadata" : {},
    "tickets" : [
        {
            "native_prices":{"7":"5500.0", "6":"5680.0", "3":"5657.0"},
            "order_urls":{"7":"1","6":"557","3":"906"},
            "direct_flights":[
                {
                    "number":"1837",
                    "airline":"FV",
                    "departure":"1294037100",
                    "arrival":"1294041900",
                    "duration":"80",
                    "delay":"0",
                    "origin":"DME",
                    "destination":"LED",
                    "aircraft":"Airbus A319"
                }
            ],
            "return_flights":[
                {
                    "number":"1858",
                    "airline":"FV",
                    "departure":"1295503800",
                    "arrival":"1295508600",
                    "duration":"80",
                    "delay":"0",
                    "origin":"LED",
                    "destination":"DME",
                    "aircraft":"Airbus A320"
                }
            ]
        }
    ],
       "airlines": {
          "AB": {
            "alliance_name": null,
            "average_rate": 3.84,
            "deeplink_id": 18,
            "homepage_id": "4ec0ff7b9f1c2760af0049d7",
            "id": 35,
            "name": "airberlin",
            "rates": 377
          },
          "AF": {
            "alliance_name": "SkyTeam",
            "average_rate": 2.89,
            "id": 48,
            "name": "Air France",
            "rates": 292
          }
        },
    "airports":{
          "ALA": {
            "average_rate": 3.66,
            "city": "\u0410\u043b\u043c\u0430\u0442\u044b",
            "country": "\u041a\u0430\u0437\u0430\u0445\u0441\u0442\u0430\u043d",
            "name": "\u0410\u043b\u043c\u0430\u0442\u044b",
            "rates": 60,
            "time_zone": "Asia/Almaty"
          },
          "AMM": {
            "average_rate": 3.42,
            "city": "\u0410\u043c\u043c\u0430\u043d",
            "country": "\u0418\u043e\u0440\u0434\u0430\u043d\u0438\u044f",
            "name": "Queen Alia International",
            "rates": 5,
            "time_zone": "Asia/Amman"
          }
    },
    "currency_rates":{"eur":"41.3564", "uah":"3.72911"},
        "gates_info": [
          {
            "average_rate": 4.34,
            "currency_code": "rub",
            "id": 1,
            "is_airline": false,
            "label": "Nabortu",
            "mobile_version": false,
            "payment_methods": [
                "bank",
                "yandex_money",
                "web_money",
                "terminal",
                "card",
                "svyaznoy",
                "euroset"
            ],
            "rates": 336
          },
          {
            "average_rate": 4.34,
            "currency_code": "rub",
            "id": 2,
            "is_airline": false,
            "label": "Davs",
            "mobile_version": false,
            "payment_methods": [
                "cash",
                "bank",
                "yandex_money",
                "web_money",
                "terminal",
                "card",
                "exp",
                "euroset"
            ],
            "rates": 416
          }
        ]
}

Ajax错误: {"readyState":0,"responseText":"","status":0,"statusText":"error"}

我添加了一些截图,这些截图是从firebug中获取的,请访问tinygrab网址查看截图:

Headers - grab.by/on5Q
Post - grab.by/on5U
Response - grab.by/on5W
Coockies - grab.by/on5Y

1
你的 Web 服务是否与此页面在同一域中?如果不是,则需要使用 dataType: 'jsonp' 以避免违反同源策略。 - Lexi Tramel
你能发布JSON结果吗?有时问题在于格式和不同类型的引号。 - winner_joiner
我检查了数据,但我只能推断出这个问题可能与服务的跨域策略有关。这是我从这些数据中能够理解的唯一意义。你尝试过下载clientaccesspolicy.xml文件来查看它的内容吗?虽然你说在Fiddler中看到了结果,但这是一个不错的尝试。希望这个指针能够帮到你。 - winner_joiner
1
可能是重复的问题:jQuery ajax函数返回错误 - winner_joiner
1
你已经找到解决方案了吗?如果是,请分享一下。谢谢 :) - winner_joiner
显示剩余2条评论
2个回答

6

如果没有看到JSON响应,我只能猜测,您的问题可能是,您使用了错误(或无)的引号来处理JSON。您必须使用双引号(用于属性名称和字符串值),或者至少在我遇到这个问题时,双引号解决了它。

例如:

{"id":1,"name":"TOM"}

我希望这能有所帮助。

谢谢,但我已经在JSON中使用了双引号。 - Nitesh Virani
你能在问题中发布JSON结果吗?因为当你使用dataType:text时它似乎可以工作,但当你使用dataType:json时它就不能工作,所以这与响应有关。 - winner_joiner
看起来OP的回复是一个有效的JSON,我的情况是由于错误的JSON格式,http://jsonlint.com帮助我找到了问题。 - Paul Lo
在我的情况下,我根本没有返回任何东西...(只有状态码200),这仍然是一个无效的JSON。 - Ondřej Želazko

2

对于其他遇到此错误的朋友,尝试将JSON值返回到您发送值的页面。

在我的情况下,我在 localhost:8080/sender 页面上向 localhost:8110/receiver 页面发送JSON数据。当接收者页面获取数据后,向发送者页面返回类似于 {} 的内容。否则,即使服务器返回200 HTTP代码,也会调用错误回调函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接