jQuery.ajax () parsererror
Quand j'essaie d'obtenir JSON à partir 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. Alors, quelle est cette erreur?
[mise à JOUR]
@3ngima, j'ai implémenté cela dans asp.net, ça marche amende:
$.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 réponses
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 aucune fin 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 est rien de plus qu'une promesse que si vous dites au service que vous appelez quel nom de fonction rappeler (généralement en mettant un paramètre callback
dans la requête), la réponse sera sous la forme de functionname(data)
, où {[5] } 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 script
src
(ce que jQuery fait pour vous), pour contourner la même Politique D'Origine {[10] } qui empêche les requêtes ajax de demander des données provenant d'origines autres que le document d'où elles proviennent (sauf si le serveur prend en charge CORS et que votre navigateur le fait également).
Si le serveur ne prend pas en charge la requête cross domain
, vous pouvez:
- créer un proxy côté serveur
- Faites une requête ajax à votre proxy qui à son tour obtiendra
json
du service, et - renvoie la réponse et vous pouvez la manipuler ...
En php, vous pouvez le faire comme ceci
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 requête ajax à votre proxy comme ceci
<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é j'obtiens la réponse json arrière...
Enfin j'ai trouvé la solution. Tout d'abord, les webmethods dans un webservice ou une page ne fonctionnent pas pour moi, il renvoie toujours xml, en local fonctionne bien mais dans un fournisseur de services comme godaddy, ce n'est pas le cas.
Ma solution était de créer un .ahsx
, un gestionnaire dans. NET et d'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