简体   繁体   中英

jQuery.ajax() parsererror

when i try to get JSON from http://api-v3.deezer.com/1.0/search/album/?q=beethoven&index=2&nb_items=2&output=json with:

(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);
    }
});

I get: parsererror; 200; undefined; jquery162******************** was not called parsererror; 200; undefined; jquery162******************** was not called

but with the JSON from http://search.twitter.com/search.json?q=beethoven&callback=?&count=5 works fine. Both are valid JSON formats. So what is this error about?

[UPDATE]

@3ngima, i have implemented this in asp.net, it works fine:

$.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; }
}

It's because you're telling jQuery that you're expecting JSON-P , not JSON , back. But the return is JSON. JSON-P is horribly mis-named, named in a way that causes no end of confusion. It's a convention for conveying data to a function via a script tag. In contrast, JSON is a data format.

Example of JSON:

{"foo": "bar"}

Example of JSON-P:

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

JSON-P works because JSON is a subset of JavaScript literal notation. JSON-P is nothing more than a promise that if you tell the service you're calling what function name to call back (usually by putting a callback parameter in the request), the response will be in the form of functionname(data) , where data will be "JSON" (or more usually, a JavaScript literal, which may not be the quite the same thing). You're meant to use a JSON-P URL in a script tag's src (which jQuery does for you), to get around the Same Origin Policy which prevents ajax requests from requesting data from origins other than the document they originate in (unless the server supports CORS and your browser does as well).

At last i have found the solution. First of all, the webmethods in a webservice or page doesn't work for me, it always returns xml, in local works fine but in a service provider like godaddy it doesn't.

My solution was to create an .ahsx , a handler in .net and wrap the content with the jquery callback function that pass the jsonp, and it works .

[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;
    }
}

And here is the call with 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);
        }
    });
});

and works perfectly

Gabriel

in case the server does not support the cross domain request you can:

  1. create a server side proxy
  2. do ajax request to your proxy which in turn will get json from the service, and
  3. return the response and then you can manipulate it ...

in php you can do it like this

proxy.php contains the following code

<?php

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

?>

and you do the ajax request to you proxy like this

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

tried and tested i get the json response back...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM