2008-10-01 195 views

Respuesta

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

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

+8

Para un mayor control sobre la solicitud HTTP puede usar "WinHttp.WinHttpRequest.5.1" en lugar de "MSXML2.ServerXMLHTTP" –

+5

Cabe destacar que también puede usar esto para emitir un HTTP PUT cambiando "POST" por "PUT". El contenido para PUT va en el método .send(). Cualquier encabezado adicional que necesite establecer se puede hacer también siguiendo la sintaxis utilizada en el ejemplo de User-Agent. – radicand

+2

No utilice paréntesis en los parámetros si no utiliza el valor de retorno del Sub: La sintaxis de VBA no permite paréntesis alrededor de los parámetros de Sub (son necesarios para las funciones), por lo que estos paréntesis son en realidad paréntesis aritméticos utilizados para aclarar la precedencia del operador . Además de ser engañoso y poco claro, esto puede dar lugar a un error de tiempo de ejecución si el argumento es un objeto. Y aunque no se solicita explícitamente, por lo general, le conviene usar la respuesta HTTP, que puede mencionar que se puede recuperar con 'objHTTP.responseText'. – Leviathan

4

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

  1. Abra el Editor de VBA (por lo general mediante la edición de una macro)
  2. Ir a la lista de referencias disponibles
  3. verificación Microsoft XML
  4. Haga clic en OK.

(de Referencing MSXML within VBA Projects)

El ServerXMLHTTP MSDN documentation tiene detalles completos sobre todas las propiedades y métodos de ServerXMLHTTP.

En resumen, sin embargo, es que funciona básicamente como esto:

  1. llamada open método para conectar con el servidor remoto
  2. send llamada para enviar la petición.
  3. Leer la respuesta a través responseXML, responseText, responseStream o responseBody
+0

ese enlace usa jscript, no VBA –

+1

Gracias @JohnHenckel. Hice algunos cambios para actualizar esa respuesta. –

49

Si lo necesita para trabajar tanto en Mac y Windows, que puede utilizar 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 devuelve 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 información, puede ver mi resumen completo sobre "using web services from Excel".

+3

+1: solo lo necesito en Windows, pero una solución multiplataforma podría beneficiar a otra persona. –

+0

No creo que realmente pueda acceder al código html, solo puede obtener la información en la página web procesada (no en el código html real) – user1493046

+1

+1 para la solución multiplataforma y +1 (si puedo) para el resumen completo con el enlace esencial y todo. ¡¡Gracias!! –

31

Además de la anwser de Bill the Lizard:

La mayoría de los backends analizar los datos de correos primas. 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, usted tiene que utilizar un adicional de cabecera "Content-Type: urlencoded-x-www-formulario de solicitud /":

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 hay que leer los datos de envío primas en la variable "$ HTTP_RAW_POST_DATA".

+0

Estoy tratando de publicar esta solicitud (con llaves) y obtener errores de compilación ... me pueden ayudar: "{" request ": {" carName ":" Honda "," model ":" 1A5 "}}" – fiddle

Cuestiones relacionadas