J'essaie d'obtenir l'exemple de code de Mozilla qui consomme un service Web REST pour fonctionner sous Firefox 3.0.10. Le code suivant ne fonctionne pas dans Firefox mais dans IE 8!Pourquoi cet exemple XMLHttpRequest de Mozilla ne fonctionne pas dans Firefox 3?
- Pourquoi cela ne fonctionne-t-il pas?
- IE 8 prend-il en charge XMLHttpRequest? La plupart des exemples que j'ai vus utilisent l'allocation ActiveX . Que devrais-je faire? XMLHttpRequest semble plus standardisé.
Exemple:
var req = new XMLHttpRequest();
req.open('GET', 'http://localhost/myRESTfulService/resource', false); // throws 'undefined' exception
req.send(null);
if(req.status == 0)
dump(req.responseText);
La déclaration ouverte est de lancer une exception avec la description 'non défini'. C'est étrange car j'alloue l'objet req, je l'exécute dans Firefox, et je vérifie qu'il est défini avant d'appeler open (qu'il dit être de type 'object').
J'ai également essayé la version asynchrone de cela sans succès.
EDIT 2: Voici mon code le plus récent:
function createRequestObject() {
if(window.XMLHttpRequest) {
return new XMLHttpRequest();
}
else if(window.ActiveXObject) {
return new ActiveXObject("Microsoft.XMLHTTP");
}
return null;
}
function handleResponse(req) {
document.writeln("Handling response..."); // NEVER GETS CALLED
if(req.readyState == 0) {
document.writeln("UNITIALIZED");
}
else if(req.readyState == 1) {
document.writeln("LOADING");
}
else if(req.readyState == 2) {
document.writeln("LOADED");
}
else if(req.readyState == 3) {
document.writeln("INTERACTIVE");
}
else if(req.readyState == 4) {
document.writeln("COMPLETE");
if(req.status == 200) {
document.writeln("SUCCESS");
}
}
}
document.writeln("");
var req = createRequestObject();
try {
document.writeln("Opening service...");
req.onreadystatechange = function() { handleResponse(req); };
req.open('POST', 'http://localhost/test/test2.txt', true); // WORKS IN IE8 & NOT FIREFOX
document.writeln("Sending service request...");
req.send('');
document.writeln("Done");
}
catch(err) {
document.writeln("ERROR: " + err.description);
}
EDIT 3: D'accord, j'ai retravaillé cette jQuery. jQuery fonctionne très bien dans IE mais il lance 'Undefined' lorsqu'il est lancé depuis Firefox. J'ai coché et "Activer JavaScript" est activé dans Firefox - semble bien fonctionner dans toutes les autres pages Web. Voici le code jQuery:
function handleResponse(resp) {
alert("Name: " + resp.Name);
alert("URL: " + resp.URL);
}
$(document).ready(function() {
$("a").click(function(event) {
try {
$.get("http://localhost/services/ezekielservices/configservice/ezekielservices.svc/test",
"{}",
function(data) { handleResponse(data); },
"json");
}
catch(err) {
alert("'$.get' threw an exception: " + err.description);
}
event.preventDefault();
});
}); // End 'ready' check
Résumé de la solution:
D'accord, leçon web 101. Mon problème était en effet interdomaine. Je regardais mon site non publié (juste sur le système de fichiers) qui frappait un service publié. Lorsque j'ai publié mon site sous le même domaine, cela a fonctionné.
Ce qui soulève également une distinction importante entre IE et Firefox. Lorsque IE rencontre ce scénario, il invite l'utilisateur à accepter ou non l'appel inter-domaine. Firefox lève une exception. Bien que je sois d'accord avec une exception, une plus descriptive aurait été utile.
Merci à tous ceux qui m'ont aidé.
J'ai utilisé votre nouveau code "légèrement modifié" sur mon serveur. il fonctionne dans Firefox 3. vérifier: http://dogself.com/telluriumTest/test.htm J'ai seulement ajouté une meilleure journalisation et supprimer cette horrible document.write merde. – mkoryak