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; }
}
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 script
src
(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).
dans le cas où le serveur ne prend pas en charge le cross domain
demande, vous pouvez:
json
du service, eten 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 ...
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