2008-10-15 113 views
33

¿Hay alguna manera de realizar una solicitud HTTP GET dentro de un script de Visual Basic? Necesito obtener el contenido de la respuesta de una URL particular para su procesamiento.HTTP GET en VBS

Respuesta

55
Dim o 
Set o = CreateObject("MSXML2.XMLHTTP") 
o.open "GET", "http://www.example.com", False 
o.send 
' o.responseText now holds the response as a string. 
+0

Solo para agregar el tercer parámetro bool se representa si la llamada se va a realizar de manera sincronizada o sincronizada. Valor falso significa que será una llamada síncrona. Además, la API abierta tiene dos parámetros más para que la autenticación pase Userid y contraseña si así lo requiere el sitio web al que se llama. – RBT

+1

Tengo problemas al usar este método de Windows 2012, creo que se debe a la gran cantidad de versiones diferentes publicadas por Microsoft. Estoy pensando en usar otro método para hacer un HTTP Obtener de vbs, alguna idea? –

+0

Ejemplo simple para una pregunta simple. Me llevó 2 horas encontrar esto, que es todo lo que necesitaba. ¡Bravo! – JediPotPie

35

En el momento de escribir esto no describió qué va a hacer con la respuesta ni cuál es su tipo de contenido. Una respuesta ya contiene un uso muy básico de MSXML2.XMLHTTP (recomiendo el MSXML2.XMLHTTP.3.0 progID más explícito). Sin embargo, es posible que deba hacer cosas diferentes con la respuesta, puede que no sea texto.

El XMLHTTP también tiene una propiedad responseBody que es una versión de matriz de bytes de la reponse y hay una responseStream que es una envoltura IStream para la respuesta.

Tenga en cuenta que en un requisito del lado del servidor (por ejemplo, VBScript alojado en ASP), debería usar MSXML.ServerXMLHTTP.3.0 o WinHttp.WinHttpRequest.5.1 (que tiene una interfaz casi idéntica).

Aquí es un ejemplo del uso XmlHttp a buscar un archivo PDF y almacenarlo: -

Dim oXMLHTTP 
Dim oStream 

Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP.3.0") 

oXMLHTTP.Open "GET", "http://someserver/folder/file.pdf", False 
oXMLHTTP.Send 

If oXMLHTTP.Status = 200 Then 
    Set oStream = CreateObject("ADODB.Stream") 
    oStream.Open 
    oStream.Type = 1 
    oStream.Write oXMLHTTP.responseBody 
    oStream.SaveToFile "c:\somefolder\file.pdf" 
    oStream.Close 
End If 
+0

hey anthony! ¿Cómo podríamos especificar las claves de autenticación o solicitar argumentos externamente? o podemos mantener eso como parte de la url. –

+0

@SushantKhurana: Dependerá de lo que el servidor esté esperando. Puede incluir encabezados adicionales en la solicitud con el método addHeader, de modo que si tiene control en ambos extremos, cree un encabezado "x-myheader" personalizado. O puede usar un "POST", agregar un encabezado Content-Type como "application/x-www-form-urlencoded" y pasar un parámetro de contineing de cadena urlencoded al método 'send'. O como dices, incluye los valores en la cadena de consulta. Realmente depende de lo que tienes disponible para ti en el servidor. – AnthonyWJones

+0

Sí. Tengo que hacer eso solo a través de un encabezado de Autorización HTTP básica. Autorización de ejemplo: QWxhZGRpbjpvcGVuIHNlc2FtZQ == –

3

Si está utilizando la solicitud GET para enviar realmente los datos ...

cheque: http://techhelplist.com/index.php/tech-tutorials/37-windows-troubles/60-vbscript-sending-get-request

El problema con MSXML2.XMLHTTP es que hay varias versiones de él, con diferentes nombres según la versión del sistema operativo de Windows y parches.

esto explica que: http://support.microsoft.com/kb/269238

que he tenido más suerte con VBScript para llamar

set ID = CreateObject("InternetExplorer.Application") 
IE.visible = 0 
IE.navigate "http://example.com/parser.php?key=" & value & "key2=" & value2 
do while IE.Busy.... 

.... y más cosas, pero sólo para que la solicitud vaya a través.

+0

Eso es feo e ineficiente, ¿por qué harías esto? Cada vez que llamas a este código estás creando una instancia de 'iexplore.exe' en segundo plano que llama a winsock.dll para gestionar la solicitud HTTP, mientras que los objetos Request del HTTP del servidor hacen esto directamente con mucha menos sobrecarga. – Lankymart

-1
 strRequest = "<soap:Envelope xmlns:soap=""http://www.w3.org/2003/05/soap-envelope"" " &_ 
     "xmlns:tem=""http://tempuri.org/"">" &_ 
     "<soap:Header/>" &_ 
     "<soap:Body>" &_ 
      "<tem:Authorization>" &_ 
       "<tem:strCC>"&1234123412341234&"</tem:strCC>" &_ 
       "<tem:strEXPMNTH>"&11&"</tem:strEXPMNTH>" &_ 
       "<tem:CVV2>"&123&"</tem:CVV2>" &_ 
       "<tem:strYR>"&23&"</tem:strYR>" &_ 
       "<tem:dblAmount>"&1235&"</tem:dblAmount>" &_ 
      "</tem:Authorization>" &_ 
     "</soap:Body>" &_ 
     "</soap:Envelope>" 

     EndPointLink = "http://www.trainingrite.net/trainingrite_epaysystem" &_ 
       "/trainingrite_epaysystem/tr_epaysys.asmx" 



dim http 
set http=createObject("Microsoft.XMLHTTP") 
http.open "POST",EndPointLink,false 
http.setRequestHeader "Content-Type","text/xml" 

msgbox "REQUEST : " & strRequest 
http.send strRequest 

If http.Status = 200 Then 
'msgbox "RESPONSE : " & http.responseXML.xml 
msgbox "RESPONSE : " & http.responseText 
responseText=http.responseText 
else 
msgbox "ERRCODE : " & http.status 
End If 

Call ParseTag(responseText,"AuthorizationResult") 

Call CreateXMLEvidence(responseText,strRequest) 

'Function to fetch the required message from a TAG 
Function ParseTag(ResponseXML,SearchTag) 

ResponseMessage=split(split(split(ResponseXML,SearchTag)(1),"</")(0),">")(1) 
Msgbox ResponseMessage 

End Function 

'Function to create XML test evidence files 
Function CreateXMLEvidence(ResponseXML,strRequest) 

Set fso=createobject("Scripting.FileSystemObject") 
Set qfile=fso.CreateTextFile("C:\Users\RajkumarJoshua\Desktop\DCIM\SampleResponse.xml",2) 
Set qfile1=fso.CreateTextFile("C:\Users\RajkumarJoshua\Desktop\DCIM\SampleReuest.xml",2) 

qfile.write ResponseXML 
qfile.close 

qfile1.write strRequest 
qfile1.close 

End Function 
+0

Necesita hacer algunos comentarios para complementar su código. – theblindprophet