Подтвердить что ты не робот

JQuery.ajax() parsererror

когда я пытаюсь получить JSON из http://api-v3.deezer.com/1.0/search/album/?q=beethoven&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. Итак, что это за ошибка?

[ОБНОВЛЕНИЕ]

@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; }
}
4b9b3361

Ответ 1

Это потому, что вы сообщаете 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 и ваш браузер тоже).

Ответ 2

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

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

в 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...

Ответ 3

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

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

[System.Web.Script.Services.ScriptService]
public class HandlerExterno : IHttpHandler
{
    string respuesta = string.Empty;

    public void ProcessRequest ( HttpContext context )
    {


       string  calls=  context.Request.QueryString["callback"].ToString();

         respuesta = ObtenerRespuesta();
        context.Response.ContentType = "application/json; charset=utf-8";
        context.Response.Write( calls +"("+    respuesta +")");
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }

    [System.Web.Services.WebMethod]
    private string ObtenerRespuesta ()
    {



        System.Web.Script.Serialization.JavaScriptSerializer j = new System.Web.Script.Serialization.JavaScriptSerializer();


        Employee[] e = new Employee[2];
        e[0] = new Employee();
        e[0].Name = "Ajay Singh";
        e[0].Company = "Birlasoft Ltd.";
        e[0].Address = "LosAngeles California";
        e[0].Phone = "1204675";
        e[0].Country = "US";
        e[1] = new Employee();
        e[1].Name = "Ajay Singh";
        e[1].Company = "Birlasoft Ltd.";
        e[1].Address = "D-195 Sector Noida";
        e[1].Phone = "1204675";
        e[1].Country = "India";

        respuesta = j.Serialize(e).ToString();
        return respuesta;

    }

}//class

public class Employee
{
    public string Name
    {
        get;
        set;
    }
    public string Company
    {
        get;
        set;
    }
    public string Address
    {
        get;
        set;
    }
    public string Phone
    {
        get;
        set;
    }
    public string Country
    {
        get;
        set;
    }
}

И вот вызов с jquery:

$(document).ready(function () {
    $.ajax({
        // url: "http://www.wookmark.com/api/json",
        url: 'http://www.gjgsoftware.com/handlerexterno.ashx',
        dataType: "jsonp",


        success: function (data) {
            alert(data[0].Name);
        },
        error: function (data, status, errorThrown) {
            $('p').html(status + ">>  " + errorThrown);
        }
    });
});

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

Габриэль