¿Cómo puedo enviar una solicitud HTTP POST a un servidor desde Excel usando VBA?
Pregunta
¿Qué código VBA se requiere para realizar una POST HTTP desde una hoja de cálculo de Excel?
Solución
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("")
Como alternativa, para un mayor control sobre la solicitud HTTP, puede usar WinHttp.WinHttpRequest.5.1
en lugar de MSXML2.ServerXMLHTTP
.
Otros consejos
Si lo necesitas para trabajar tanto en Mac como en Windows, puedes usar 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
Notas:
- Respecto a la salida ... No sé si es posible devolver los resultados a la misma celda que llamó a la función VBA. En el ejemplo anterior, el resultado se escribe en A2.
- Respecto a la entrada ... Si desea que los resultados se actualicen cuando cambie ciertas celdas, asegúrese de que esas celdas sean el argumento de su función VBA.
- Esto no funcionará en Excel para Mac 2008, que no tiene VBA. Excel para Mac 2011 recuperó VBA.
Para obtener más detalles, puede ver mi resumen completo sobre " usando servicios web de Excel . "
Además de la respuesta de Bill the Lizard :
La mayoría de los backends analizan los datos de publicación sin procesar. En PHP, por ejemplo, tendrá una matriz $ _POST en la que se almacenarán las variables individuales dentro de los datos de la publicación. En este caso, debe utilizar un encabezado adicional " Tipo de contenido: 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")
De lo contrario, debe leer los datos de publicación sin procesar en la variable " $ HTTP_RAW_POST_DATA " ;.
Puede usar ServerXMLHTTP en un proyecto de VBA agregando una referencia a MSXML.
- Abra el Editor de VBA (generalmente editando una macro)
- Vaya a la lista de referencias disponibles
- Comprobar Microsoft XML
- Haz clic en Aceptar.
(de Cómo hacer referencia al MSXML en proyectos de VBA )
La ServerXMLHTTP MSDN documentación tiene Detalles completos sobre todas las propiedades y métodos de ServerXMLHTTP.
En resumen, funciona básicamente así:
- Llame al método open para conectarse al servidor remoto
- Llame a envíe para enviar el solicitud.
- Lea la respuesta a través de responseXML , responseText , responseStream o responseBody
Hice esto antes de usar la biblioteca MSXML y luego usar el objeto XMLHttpRequest. Consulte http://scriptorium.serve-it.nl/view.php?sid = 40