2009-05-25 6 views
11

Existe-t-il un moyen d'appeler une URL et d'obtenir une réponse en utilisant javascript? J'ai besoin l'équivalent d'ASP.NET:
Appeler une URL à partir de javascript

WebRequest req = HttpWebRequest.Create("http://someurl.com"); 
WebResponse webResponse = req.GetResponse(); 

J'ai une URL externe qui détient des informations dont j'ai besoin et je veux appeler cette URL de javascript et analyser la réponse afin de déterminer ce qu'il faut faire mon application.

+4

FYI: JavaScript ne peut parler qu'au même domaine. Vous pouvez vous en passer avec les appels JSON aux autres, mais mieux utiliser un proxy. – epascarello

Répondre

15

Vous pouvez effectuer une requête AJAX si l'URL est dans le même domaine, par exemple la même application hôte différente. Si oui, j'utiliserais probablement un framework comme jQuery, probablement la méthode get.

$.get('http://someurl.com',function(data,status) { 
     ...parse the data... 
},'html'); 

Si vous rencontrez des problèmes de domaine croisés, alors votre meilleur pari est de créer une action côté serveur qui proxie la demande pour vous. Faites votre demande à votre serveur en utilisant AJAX, demandez au serveur et renvoyez la réponse de l'hôte externe.

Merci à @ nickf, pour avoir signalé le problème évident avec ma solution d'origine si l'URL est dans un domaine différent.

+0

cela ne fonctionnera pas en raison de stratégies de sécurité inter-domaine. – nickf

+4

Incroyable ce qui manque un seul mot peut faire dans un poste .... – tvanfosson

4
var req ; 

// Browser compatibility check   
if (window.XMLHttpRequest) { 
    req = new XMLHttpRequest(); 
    } else if (window.ActiveXObject) { 

try { 
    req = new ActiveXObject("Msxml2.XMLHTTP"); 
} catch (e) { 

    try { 
    req = new ActiveXObject("Microsoft.XMLHTTP"); 
    } catch (e) {} 
} 

} 


var req = new XMLHttpRequest(); 
req.open("GET", "test.html",true); 
req.onreadystatechange = function() { 
    //document.getElementById('divTxt').innerHTML = "Contents : " + req.responseText; 
} 

req.send(null); 
+1

Ne pas oublier d'inclure le soutien pour les anciens IE. –

+2

Ne pas oublier le grand avertissement ennuyeux lorsque les visiteurs viennent sur votre site supportant une ancienne version de IE. http://iedeathmarch.org/ – yfeldblum

+0

Oui, il y a des problèmes si le code (même jquery) est utilisé dans un ancien navigateur. – NinethSense

2

Oui, ce que vous demandez est appelé AJAX ou XMLHttpRequest. Vous pouvez utiliser une bibliothèque comme jQuery pour simplifier l'appel (en raison de problèmes de compatibilité entre navigateurs) ou écrire votre propre gestionnaire.

En jQuery:

$.GET('url.asp', {data: 'here'}, function(data){ /* what to do with the data returned */ }) 

Dans la vanille plaine javaScript (de w3c): vous ne serez pas en mesure

var xmlhttp; 
function loadXMLDoc(url) 
{ 
    xmlhttp=null; 
if (window.XMLHttpRequest) 
    {// code for all new browsers 
     xmlhttp=new XMLHttpRequest(); 
    } 
else if (window.ActiveXObject) 
    {// code for IE5 and IE6 
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
if (xmlhttp!=null) 
    { 
     xmlhttp.onreadystatechange=state_Change; 
     xmlhttp.open("GET",url,true); 
     xmlhttp.send(null); 
    } 
else 
    { 
     alert("Your browser does not support XMLHTTP."); 
    } 
} 

function state_Change() 
{ 
    if (xmlhttp.readyState==4) 
     {// 4 = "loaded" 
      if (xmlhttp.status==200) 
      {// 200 = OK 
      //xmlhttp.data and shtuff 
      // ...our code here... 
     } 
    else 
     { 
      alert("Problem retrieving data"); 
     } 
    } 
} 
2

Si vous devez être vérifier des pages externes, de sortir avec solution javascript pure, car toutes les demandes d'URL externes sont bloquées. Vous pouvez vous en sortir en utilisant JSONP, mais cela ne fonctionnera que si la page que vous demandez ne sert qu'à JSON.

Vous devez avoir un proxy sur votre propre serveur pour obtenir les liens externes pour vous. C'est en fait plutôt simple avec n'importe quel langage côté serveur.

<?php 
$contents = file_get_contents($_GET['url']); // please do some sanitation here... 
              // i'm just showing an example. 
echo $contents; 
?> 

Si vous avez besoin de vérifier les codes de réponse du serveur (par exemple: 404, 301, etc.), puis en utilisant une bibliothèque telle que cURL dans votre script côté serveur peut récupérer ces informations et passer ensuite sur votre application javascript .

En pensant à cela maintenant, il pourrait probablement y avoir des proxies JSONP-enabled là pour que vous puissiez utiliser, si l'option "installer mon propre proxy" n'est pas viable.

+0

Si vous souhaitez appeler une ressource située sur un domaine différent, ou même un sous-domaine différent, vous devrez utiliser une sorte de solution de rechange. Voir l'exemple de Yahoo d'un fichier proxy en PHP: http://developer.yahoo.com/javascript/howto-proxy.html Snook a une bonne vue d'ensemble des solutions de contournement avec les appels AJAX effectués sur plusieurs domaines. Voir http://snook.ca/archives/javascript/cross_domain_aj/ –

Questions connexes