2008-10-01 7 views

Répondre

116
Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP") 
URL = "http://www.somedomain.com" 
objHTTP.Open "POST", URL, False 
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" 
objHTTP.send("") 

Sinon, pour un meilleur contrôle sur la requête HTTP, vous pouvez utiliser WinHttp.WinHttpRequest.5.1 en place de MSXML2.ServerXMLHTTP.

+8

Pour un meilleur contrôle sur la requête HTTP, vous pouvez utiliser "WinHttp.WinHttpRequest.5.1" au lieu de "MSXML2.ServerXMLHTTP" –

+5

Il convient de noter que vous pouvez également utiliser cette commande pour émettre un HTTP PUT en changeant "POST" en "PUT". Le contenu de PUT va dans la méthode .send(). Tous les en-têtes supplémentaires que vous devez définir peuvent être effectués en suivant la syntaxe utilisée dans l'exemple User-Agent. – radicand

+2

Veuillez ne pas utiliser de parenthèses autour des paramètres si vous n'utilisez pas la valeur de retour du Sub: VBA Syntaxe n'autorise pas les parenthèses autour des paramètres Sub (ils sont cependant nécessaires pour les fonctions), donc ces parenthèses sont des parenthèses arithmétiques . En plus d'être trompeur et peu clair, cela peut éventuellement entraîner une erreur d'exécution si l'argument est un objet. Et bien que ce ne soit pas explicitement demandé, habituellement vous voudriez utiliser la réponse HTTP, que vous pourriez mentionner peut être récupérée par 'objHTTP.responseText'. – Leviathan

4

Vous pouvez utiliser ServerXMLHTTP dans un projet VBA en ajoutant une référence à MSXML.

  1. Ouvrez l'éditeur VBA (généralement en éditant une macro)
  2. Aller à la liste des références disponibles
  3. Vérifiez Microsoft XML
  4. Cliquez sur OK.

(de Referencing MSXML within VBA Projects)

Le ServerXMLHTTP MSDN documentation a plus de détails sur toutes les propriétés et méthodes de ServerXMLHTTP.

En bref cependant, il fonctionne essentiellement comme ceci:

  1. Appel de méthode open pour se connecter au serveur distant
  2. Appel send pour envoyer la demande.
  3. Lire la réponse via responseXML, responseText, responseStream ou responseBody
+0

ce lien utilise jscript, pas VBA –

+1

Merci @JohnHenckel. J'ai apporté quelques changements pour mettre cette réponse à jour. –

49

Si vous avez besoin de travailler sur Mac et Windows, vous pouvez utiliser QueryTables:

With ActiveSheet.QueryTables.Add(Connection:="URL;http://carbon.brighterplanet.com/flights.txt", Destination:=Range("A2")) 
    .PostText = "origin_airport=MSN&destination_airport=ORD" 
    .RefreshStyle = xlOverwriteCells 
    .SaveData = True 
    .Refresh 
End With 

Notes:

  • En ce qui concerne la sortie ... Je ne sais pas s'il est possible de renvoie les résultats à la même cellule qui a appelé la fonction VBA. Dans l'exemple ci-dessus, le résultat est écrit en A2.
  • En ce qui concerne l'entrée ... Si vous voulez que les résultats soient actualisés lorsque vous changez certaines cellules, assurez-vous que ces cellules sont l'argument de votre fonction VBA.
  • Cela ne fonctionnera pas sur Excel pour Mac 2008, qui ne possède pas VBA. Excel pour Mac 2011 a retrouvé VBA.

Pour plus de détails, vous pouvez voir mon résumé complet sur "using web services from Excel".

+3

+1: Je n'en ai besoin que sous Windows, mais une solution multiplateforme pourrait bénéficier à quelqu'un d'autre. –

+0

Je ne pense pas que vous pouvez réellement accéder au code html, vous ne pouvez obtenir les informations sur la page Web rendue (pas le code html réel) – user1493046

+1

+1 pour la solution multiplateforme et +1 (si je pouvais) pour le résumé complet avec le lien gist et tout. Merci!! –

31

En plus du anwser de Bill the Lizard:

La plupart des backends analysent les données brutes POST. En PHP par exemple, vous aurez un tableau $ _POST dans lequel des variables individuelles dans les données de poste seront stockées.Dans ce cas, vous devez utiliser un en-tête supplémentaire "Content-type: application/x-www-form-urlencoded":

Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1") 
URL = "http://www.somedomain.com" 
objHTTP.Open "POST", URL, False 
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" 
objHTTP.setRequestHeader "Content-type", "application/x-www-form-urlencoded" 
objHTTP.send ("var1=value1&var2=value2&var3=value3") 

Sinon, vous devez lire les données POST brutes sur la variable "$ HTTP_RAW_POST_DATA".

+0

J'essaye de signaler cette demande (avec des accolades) et obtenir des erreurs de compilation ... peut nous aider: "{" request ": {" carName ":" Honda "," model ":" 1A5 "}}" – fiddle

Questions connexes