jQuery.ajax () parsererror - PullRequest
       8

jQuery.ajax () parsererror

22 голосов
/ 11 июля 2011

, когда я пытаюсь получить JSON из http://api -v3.deezer.com / 1.0 / search / album /? Q = Бетховен & index = 2 & nb_items = 2 & output = json с:

(jQuery 1.6.2)

$.ajax({
    type: "GET",
    url: url,
    dataType: "jsonp",
    success: function (result) {
        alert("SUCCESS!!!");
    },
    error: function (xhr, ajaxOptions, thrownError) {
        alert(xhr.statusText);
        alert(xhr.responseText);
        alert(xhr.status);
        alert(thrownError);
    }
});

Я получаю: parsererror; 200; undefined; jquery162******************** was not called

, но с JSON из http://search.twitter.com/search.json?q=beethoven&callback=?&count=5 работает нормально. Оба являются допустимыми форматами JSON. Так о чем эта ошибка?

[UPDATE]

@ 3ngima, я реализовал это в asp.net, он отлично работает:

$.ajax({
    type: "POST",
    url: "WebService.asmx/GetTestData",
    data: "{}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (result) {
        alert(result.d);
    }
});

WebService.asmx:

[WebMethod]
public string GetTestData()
{
    try
    {
        var req = System.Net.HttpWebRequest.Create("http://api-v3.deezer.com/1.0/search/album/?q=beethoven&index=2&nb_items=2&output=json");
        using (var resp = req.GetResponse())
        using (var stream = resp.GetResponseStream())
        using (var reader = new System.IO.StreamReader(stream))
        return reader.ReadToEnd();
    }
    catch (Exception) { return null; }
}

Ответы [ 3 ]

34 голосов
/ 11 июля 2011

Это потому, что вы говорите jQuery, что ожидаете JSON-P , а не JSON , назад.Но возвращение JSON.JSON-P ужасно неправильно назван, назван так, чтобы не было путаницы.Это соглашение для передачи данных в функцию через тег script.Напротив, JSON - это формат данных.

Пример JSON:

{"foo": "bar"}

Пример JSON-P:

yourCallback({"foo": "bar"});

JSON-P работает, потому что JSONподмножество буквенной нотации JavaScript.JSON-P - это не что иное, как обещание, что если вы сообщите службе, которую вы вызываете, какое имя функции нужно отозвать (обычно путем добавления в запрос параметра callback), ответ будет в форме functionname(data)где data будет "JSON" (или, более обычно, литералом JavaScript, что может не совпадать с * ).Вы должны использовать URL-адрес JSON-P в теге script src (что делает для вас jQuery), чтобы обойти Политика одинакового происхождения , которая запрещает запросам ajax запрашивать данные у источникакроме документа, из которого они исходят (если сервер не поддерживает CORS , а ваш браузер поддерживает).

0 голосов
/ 02 февраля 2013

Наконец-то я нашел решение.Прежде всего, веб-методы в веб-сервисе или на странице не работают для меня, они всегда возвращают xml, на локальном работает нормально, но у такого поставщика услуг, как godaddy, нет..ahsx, обработчик в .net и оборачивает содержимое с помощью функции обратного вызова jquery, которая передает jsonp, и это работает.*

и отлично работает

Габриэль

0 голосов
/ 11 июля 2011

если сервер не поддерживает запрос cross domain, вы можете:

  1. создать прокси на стороне сервера
  2. сделать запрос ajax к вашему прокси, который, в свою очередь, получит json от службы и
  3. верните ответ, и тогда вы сможете манипулировать им ...

в php вы можете сделать это следующим образом

proxy.php содержит следующий код

<?php

if(isset($_POST['geturl']) and !empty($_POST['geturl'])) {
$data = file_get_contents($_POST['geturl']);
print $data;
}

?>

и вы делаете запрос ajax для вашего прокси, как это

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(function(){
$("#btn").click(function(){
alert("abt to do ajax");

$.ajax({
url:'proxy.php',
type:"POST",
data:{geturl:'http://api-v3.deezer.com/1.0/search/album/?q=beethoven&index=2&nb_items=2&output=json'},
success:function(data){
alert("success");
alert(data);
}    
});    
});   
});
</script>

попробовал и протестировал, я получаю ответ json ...

...