web-dev-qa-db-fra.com

analyseur jQuery.ajax ()

quand j'essaye d'obtenir JSON de http://api-v3.deezer.com/1.0/search/album/?q=beethoven&index=2&nb_items=2&output=json avec:

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

Je reçois: parsererror; 200; undefined; jquery162******************** was not called

mais avec le JSON de http://search.Twitter.com/search.json?q=beethoven&callback=?&count=5 fonctionne très bien. Les deux sont des formats JSON valides. Quelle est donc cette erreur?

[MISE À JOUR]

@ 3ngima, j'ai implémenté ceci dans asp.net, cela fonctionne très bien:

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

C'est parce que vous dites à jQuery que vous attendez JSON-P , pas JSON , retour. Mais le retour est JSON. JSON-P est horriblement mal nommé, nommé d'une manière qui ne provoque pas de confusion. C'est une convention pour transmettre des données à une fonction via une balise script. En revanche, JSON est un format de données.

Exemple de JSON:

{"foo": "bar"}

Exemple de JSON-P:

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

JSON-P fonctionne car JSON est un sous-ensemble de la notation littérale JavaScript. JSON-P n'est rien d'autre qu'une promesse que si vous dites au service que vous appelez le nom de la fonction à rappeler (généralement en mettant un paramètre callback dans la demande), la réponse sera sous la forme de functionname(data), où data sera "JSON" (ou plus généralement, un littéral JavaScript, qui peut ne pas être le tout à fait la même chose). Vous êtes censé utiliser une URL JSON-P dans une balise scriptsrc (que jQuery fait pour vous), pour contourner la même politique d'origine qui empêche ajax demande de demander des données provenant d'origines autres que le document dans lequel elles proviennent (à moins que le serveur ne prenne en charge CORS et votre navigateur le fait également).

34
T.J. Crowder

dans le cas où le serveur ne prend pas en charge le cross domain demande, vous pouvez:

  1. créer un proxy côté serveur
  2. faites une requête ajax à votre proxy qui à son tour obtiendra json du service, et
  3. retourner la réponse et ensuite vous pouvez la manipuler ...

en php, vous pouvez le faire comme ça

proxy.php contient le code suivant

<?php

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

?>

et vous faites la demande ajax à votre proxy comme celui-ci

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

essayé et testé, je reçois la réponse json ...

0
Rafay

J'ai enfin trouvé la solution. Tout d'abord, les méthodes Web dans un service Web ou une page ne fonctionnent pas pour moi, elles retournent toujours du xml, dans les travaux locaux, mais pas dans un fournisseur de services comme godaddy.

Ma solution a été de créer un .ahsx, un gestionnaire en .net et envelopper le contenu avec la fonction de rappel jquery qui passe le jsonp, et cela fonctionne.

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

Et voici l'appel avec 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);
        }
    });
});

et fonctionne parfaitement

Gabriel

0
gabriel