Quel code VBA est requis pour exécuter un POST HTTP à partir d'une feuille de calcul Excel?Comment envoyer une requête HTTP POST à un serveur à partir d'Excel à l'aide de VBA?
Répondre
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
.
Vous pouvez utiliser ServerXMLHTTP dans un projet VBA en ajoutant une référence à MSXML.
- Ouvrez l'éditeur VBA (généralement en éditant une macro)
- Aller à la liste des références disponibles
- Vérifiez Microsoft XML
- 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:
- Appel de méthode open pour se connecter au serveur distant
- Appel send pour envoyer la demande.
- Lire la réponse via responseXML, responseText, responseStream ou responseBody
ce lien utilise jscript, pas VBA –
Merci @JohnHenckel. J'ai apporté quelques changements pour mettre cette réponse à jour. –
Je l'ai fait avant d'utiliser la bibliothèque MSXML, puis en utilisant l'objet XMLHttpRequest. Voir http://scriptorium.serve-it.nl/view.php?sid=40
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".
+1: Je n'en ai besoin que sous Windows, mais une solution multiplateforme pourrait bénéficier à quelqu'un d'autre. –
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 pour la solution multiplateforme et +1 (si je pouvais) pour le résumé complet avec le lien gist et tout. Merci!! –
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".
J'essaye de signaler cette demande (avec des accolades) et obtenir des erreurs de compilation ... peut nous aider: "{" request ": {" carName ":" Honda "," model ":" 1A5 "}}" – fiddle
Pour un meilleur contrôle sur la requête HTTP, vous pouvez utiliser "WinHttp.WinHttpRequest.5.1" au lieu de "MSXML2.ServerXMLHTTP" –
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
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