xmlhttp winhttprequest setrequestheader microsoft macro excel http excel-vba post serverxmlhttp

winhttprequest - ¿Cómo puedo enviar una solicitud HTTP POST a un servidor desde Excel usando VBA?



winhttp winhttprequest 5.1 vba (5)

¿Qué código de VBA se requiere para realizar un HTTP POST desde una hoja de cálculo de Excel?


Además del artículo 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 variables individuales dentro de los datos de la publicación. En este caso, debe usar 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 formato en la variable "$ HTTP_RAW_POST_DATA".



Puede usar ServerXMLHTTP en un proyecto de VBA agregando una referencia a MSXML.

  1. Abra el Editor de VBA (generalmente editando una Macro)
  2. Ir a la lista de referencias disponibles
  3. Compruebe Microsoft XML
  4. Haga clic en Aceptar.

(de referencia de MSXML dentro de los proyectos de VBA )

La documentación de ServerXMLHTTP MSDN tiene todos los detalles sobre todas las propiedades y métodos de ServerXMLHTTP.

En resumen, funciona básicamente así:

  1. Método de llamada open para conectarse al servidor remoto
  2. Llamar send para enviar la solicitud.
  3. Lea la respuesta a través de responseXML , responseText , responseStream o responseBody

Si necesita que funcione tanto en Mac como en Windows, puede 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:

  • En cuanto 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 está escrito en A2.
  • En cuanto 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 "el uso de servicios web desde Excel ".


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("")

Alternativamente, para un mayor control sobre la solicitud HTTP puede usar WinHttp.WinHttpRequest.5.1 en lugar de MSXML2.ServerXMLHTTP .