Come posso inviare una richiesta POST HTTP a un server da Excel utilizzando VBA?
Domanda
Quale codice VBA è necessario per eseguire un POST HTTP da un foglio di calcolo Excel?
Soluzione
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("")
In alternativa, per un maggiore controllo sulla richiesta HTTP è possibile utilizzare WinHttp.WinHttpRequest.5.1
al posto di MSXML2.ServerXMLHTTP
.
Altri suggerimenti
Se ne hai bisogno per funzionare sia su Mac che su Windows, puoi utilizzare 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
Note:
- Per quanto riguarda l'output ... Non so se è possibile restituire i risultati alla stessa cella che ha chiamato la funzione VBA. Nell'esempio sopra, il risultato è scritto in A2.
- Riguardo all'input ... Se vuoi che i risultati si aggiornino quando cambi determinate celle, assicurati che quelle celle siano l'argomento della tua funzione VBA.
- Questo non funzionerà su Excel per Mac 2008, che non ha VBA. Excel per Mac 2011 ha restituito VBA.
Per maggiori dettagli, puoi vedere il mio sommario completo su " utilizzando servizi web da Excel . "
Oltre alla risposta di Bill the Lizard :
La maggior parte dei backend analizza i dati grezzi dei post. In PHP, ad esempio, avrai un array $ _POST in cui verranno memorizzate le singole variabili all'interno dei dati di post. In questo caso devi utilizzare un'intestazione aggiuntiva " Tipo di contenuto: 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")
Altrimenti devi leggere i dati grezzi dei post sulla variabile " $ HTTP_RAW_POST_DATA " ;.
È possibile utilizzare ServerXMLHTTP in un progetto VBA aggiungendo un riferimento a MSXML.
- Apri l'editor VBA (di solito modificando una macro)
- Vai all'elenco dei riferimenti disponibili
- Controlla Microsoft XML
- Fai clic su OK.
(da Riferimenti a MSXML all'interno di progetti VBA )
La Documentazione MSDN ServerXMLHTTP ha tutti i dettagli su tutte le proprietà e i metodi di ServerXMLHTTP.
In breve, funziona sostanzialmente in questo modo:
- Chiama il metodo open per connetterti al server remoto
- Chiama invia per inviare il richiesta.
- Leggi la risposta tramite responseXML , responseText , responseStream o responseBody
L'ho fatto prima di usare la libreria MSXML e poi usare l'oggetto XMLHttpRequest. Vedi http://scriptorium.serve-it.nl/view.php?sid = 40