2010-07-13 4 views
1

J'utilise un service Web qui renvoie des données JSON.JSON ne se charge pas avec jQuery.ajax()

test.com/incident.do?JSON & sysparm_action = getRecords

Chargement cette URL dans un navigateur me invite à ouvrir incident.do, qui a ouvert dans le Bloc-notes affiche les données JSON valides.

Puis, dans une page Web dans le même domaine, j'utilise ceci:

$.ajax({ 
    beforeSend: function(xhr) { 
xhr.setRequestHeader('Authorization', authinfo);   
}, 
    url: "https://test.com/incident.do?JSON&sysparm_action=getRecords", 
    dataType: 'json', 
    type: 'GET', 
    success: function(a,b,c) { 
    alert(a); 
    } 
}); 

Cependant, avec ce code que je ne reçois aucun JSON, je ne reçois que cette réponse

HTTP/1.1 200 OK 
Date: Tue, 13 Jul 2010 22:28:09 GMT 
Server: Apache-Coyote/1.1 
Allow: GET, HEAD, POST, TRACE, OPTIONS 
Content-Length: 0 
Keep-Alive: timeout=5, max=100 
Connection: Keep-Alive 
Content-Type: text/plain 

Qu'est-ce que je fais mal ici?

EDIT: Si cela peut aider quelqu'un, j'ai un lien vers le bac à sable sur le site Web du fournisseur qui offre les mêmes fonctionnalités ... Le nom d'utilisateur/mot de passe admin/admin

https://demo.service-now.com/incident.do?JSON&sysparm_action=getRecords

+0

est le Content-Type 'application/json' pour cette URL? –

+0

@meder Oui, j'ai essayé de définir le Content-Type, même problème. – imagineblue

+0

Si vous ne recevez pas de réponse Content-Type: application/json depuis le service Web, même si vous répondez à un objet json, cela ne fonctionnera pas. – Rodrigo

Répondre

0

Essayez de mettre le contentType

$.ajax({ 
    beforeSend: function(xhr) { 
xhr.setRequestHeader('Authorization', authinfo);   
}, 
    url: "https://test.com/incident.do?JSON&sysparm_action=getRecords", 

    contentType: "application/json", 

    dataType: 'json', 
    type: 'GET', 
    success: function(a,b,c) { 
    alert(a); 
    } 
}); 

MISE À JOUR

Cette est la bonne façon d'appeler. Mais si vous faites une demande à une page de votre domaine, cela ne fonctionnera pas. Pour cela, vous auriez besoin d'un proxy. Voici un simple proxy PHP:

<?php 
    /* Set the headers for application/json , xml, or whatever */ 
    echo @file_get_contents(urldecode($_GET['url'])); 
?> 

Ensuite, votre demande devrait être à cette page, comme ceci:

$.ajax({ 
    beforeSend: function(xhr) { 
xhr.setRequestHeader('Authorization', authinfo);   
}, 
    url: "myproxy.php?url=" + escape("https://test.com/incident.do?JSON&sysparm_action=getRecords"), 

    contentType: "application/json", 

    dataType: 'json', 
    type: 'GET', 
    success: function(a,b,c) { 
    alert(a); 
    } 
}); 
+0

Merci, j'ai essayé mais j'ai le même problème. – imagineblue

+0

Merci pour votre aide :) Le problème était le suivant: Je faisais ces appels sur le même domaine que le serveur, mais le proxy utilisé par mon ordinateur pour se connecter au domaine n'était configuré que pour IE! Cela ne fonctionnait pas dans Firefox, mais en essayant le code dans IE ça a bien fonctionné, donc ça a fini par être un problème de proxy après tout. – imagineblue

0

Essayez de supprimer "type": "GET". Les requêtes Ajax jQuery sont GET par défaut.

Peut-être que vous avez des limitations du navigateur XSS. La page Web est-elle également diffusée via HTTPS? Si la page contenant l'appel ajax est HTTP et que le point de terminaison AJAX est HTTPS, cela violerait la même règle d'origine. Plus de discussion here.

De jQuery Doco:

En raison des restrictions de sécurité du navigateur, la plupart des demandes "Ajax" sont soumis à la même politique d'origine; la demande ne peut pas récupérer les données à partir d'un domaine différent, d'un sous-domaine ou du protocole .

Selon wikipedia, http://test.com et https://test.com sont différentes origines et donc même politique violent d'origine. Essayez aussi de faire votre page HTTPS.

$.ajax({ 
    beforeSend: function(xhr) { 
xhr.setRequestHeader('Authorization', authinfo);   
}, 
    url: "https://test.com/incident.do?JSON&sysparm_action=getRecords", 
    dataType: 'json', 
    success: function(a,b,c) { 
    alert(a); 
    } 
}); 
+0

Merci, mais après avoir supprimé "type": "GET" Je suis toujours le même problème – imagineblue