Foros del Web » Programando para Internet » ASP Clásico »

Invocar función dentro de un servicio web desde ASP

Estas en el tema de Invocar función dentro de un servicio web desde ASP en el foro de ASP Clásico en Foros del Web. Hola, estoy intentando implementar una llamada a un servicio web (definido con WSDL) desde un script ASP. Como parámetro tengo un fichero XML (que ya ...
  #1 (permalink)  
Antiguo 08/07/2008, 05:32
Avatar de PosProdukcion  
Fecha de Ingreso: noviembre-2004
Ubicación: Manzanares el Real (Madrid)
Mensajes: 726
Antigüedad: 19 años, 5 meses
Puntos: 9
Invocar función dentro de un servicio web desde ASP

Hola, estoy intentando implementar una llamada a un servicio web (definido con WSDL) desde un script ASP.

Como parámetro tengo un fichero XML (que ya tengo formado) y como respuesta otro XML, ahora ignoro de qué manera hacer la llamada concreta al servicio y a la función deseada dentro de este y como pasar el parámetro.

También ignoro según la definción del WSDL si necesito el SOAP o me basta con MSXML2.XMLHTTP (según esto)

He leido acerca de SOAP y WSDL y bueno, algo he logrado enterarme pero ahora ignoro de que manera realizar la llamada desde ASP...

La definición del WSDL es esta:

Código:
<wsdl:definitions targetNamespace="https://www.url_proveedor.es/proveedor/axis/SolicitudService">
<wsdl:message name="registrarXmlRequest">
 <wsdl:part name="xml" type="xsd:string"/>
 </wsdl:message>
<wsdl:message name="registrarXmlResponse">
 <wsdl:part name="registrarXmlReturn" type="xsd:string"/>
 </wsdl:message>
<wsdl:portType name="JaxRpcSolicitudService">
<wsdl:operation name="registrarXml" parameterOrder="xml">
 <wsdl:input message="impl:registrarXmlRequest" name="registrarXmlRequest"/>
 <wsdl:output message="impl:registrarXmlResponse" name="registrarXmlResponse"/>
 </wsdl:operation>
 </wsdl:portType>
<wsdl:binding name="SolicitudServiceSoapBinding" type="impl:JaxRpcSolicitudService">
 <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="registrarXml">
 <wsdlsoap:operation soapAction=""/>
<wsdl:input name="registrarXmlRequest">
 <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://servicioweb.agencia.com" use="encoded"/>
 </wsdl:input>
<wsdl:output name="registrarXmlResponse">
 <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="https://www.url_proveedor.es/proveedor/axis/SolicitudService" use="encoded"/>
 </wsdl:output>
 </wsdl:operation>
 </wsdl:binding>
<wsdl:service name="JaxRpcSolicitudServiceService">
<wsdl:port binding="impl:SolicitudServiceSoapBinding" name="SolicitudService">
 <wsdlsoap:address location="https://www.url_proveedor.es/proveedor/axis/SolicitudService"/>
 </wsdl:port>
 </wsdl:service>
 </wsdl:definitions>
O sea, quiero invocar un servicio:

https://www.url_proveedor.es:443/pro...licitudService

Dentro de este la función registrarXml con los parámetros input registrarXmlRequest y output registrarXmlResponse, formateados en Base 64.

¿Como se ajusta esto al siguiente código? ¿Como se si es GET o POST o ninguna de ellas (el WSDL define un binding style="rpc")? Este código me da una URL de un servicio, pero como invoco una función dentro de este servicio?:

Código:

dim objXML
set objXML = CreateObject("MSXML2.ServerXMLHTTP")
objXML.Open "GET", strURL, False 'SUPONGO QUE AQUI INVOCO EL SERVICIO ¿COMO INVOCO LA FUNCIÓN?
objXML.Send
strQuote = objXML.ResponseText 'SUPONGO QUE AUI CAPTURO LA RESPUESTA
set objXML = nothing
Gracias
  #2 (permalink)  
Antiguo 25/09/2008, 02:01
Avatar de PosProdukcion  
Fecha de Ingreso: noviembre-2004
Ubicación: Manzanares el Real (Madrid)
Mensajes: 726
Antigüedad: 19 años, 5 meses
Puntos: 9
Respuesta: Invocar función dentro de un servicio web desde ASP

Hace tiempo que logré solucionarlo, pero tardé en poner aquí la solución, por si le interesa a alguien.

Para codificar SOAP ENVELOPE en estilo RPC/Encoded o en otros estilos puedes leer esta documentación.

Para invocar un servicio web desde ASP Clásico, puedes usar esto:

Código asp:
Ver original
  1. Function llamadaServicioWEB(xmlSOAP)
  2.         Dim oSOAPprov
  3.         Dim strURL, SoapServer, SoapPath
  4.  
  5.         strURL = "https://www.proveedor.com/carpetaServ/axis/ElServicio?wsdl"
  6.         SoapServer = "www.proveedor.com"
  7.         SoapPath = "/carpetaServ/axis/ElServicio?wsdl"
  8.  
  9.         Set oSOAPprov = Server.CreateObject("MSXML2.ServerXMLHTTP")
  10.  
  11.         oSOAPprov.Open "POST", strURL, False
  12.  
  13.         oSOAPprov.setRequestHeader "Man", "POST " & SoapPath & " HTTP/1.1"
  14.         oSOAPprov.setRequestHeader "Host", SoapServer
  15.         oSOAPprov.setRequestHeader "Content-Type", "text/xml; charset=utf-8"
  16.         oSOAPprov.setRequestHeader "SOAPAction", "https://www.proveedor.com/carpetaServ/axis/ElServicio"
  17.  
  18.         oSOAPprov.Send(xmlSOAP)
  19.         Set xmlSOAP = nothing
  20.  
  21.         Dim xmlRespuesta, strRespuesta
  22.         If oSOAPprov.status = 200 Then '200 = STATUS OK
  23.             Set xmlRespuesta = Server.CreateObject("Microsoft.XMLDOM")
  24.             xmlRespuesta.loadXML(oSOAPprov.ResponseText)
  25.  
  26.             ' ==== ANALIZAR RESPUESTA SEGUN CADA CASO ====
  27.  
  28.             Set xmlRespuesta = nothing
  29.         Else
  30.             'Si status <> 200 no puede analizar la respuesta
  31.             strRespuesta = "Error " & oSOAPprov.status & ": " & errServerXMLHTTP(oSOAPprov.status)
  32.         End If
  33.         Set oSOAPprov = nothing
  34.        
  35.         llamadaServicioWEB = strRespuesta
  36.     End Function

Acerca de las líneas siguientes, son imprescindibles para establecer las cabeceras del paquete HTTP, si no se ponen, el servicio devolverá el error "NO SOAP-Action Header"

Código asp:
Ver original
  1. oSOAPprov.setRequestHeader "Man", "POST " & SoapPath & " HTTP/1.1"
  2. oSOAPprov.setRequestHeader "Host", SoapServer
  3. oSOAPprov.setRequestHeader "Content-Type", "text/xml; charset=utf-8"
  4. oSOAPprov.setRequestHeader "SOAPAction", "https://www.proveedor.com

Última edición por PosProdukcion; 25/09/2008 a las 06:09
  #3 (permalink)  
Antiguo 10/02/2010, 10:44
Avatar de Fanathur  
Fecha de Ingreso: noviembre-2009
Mensajes: 3
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: Invocar función dentro de un servicio web desde ASP

Gracias por el código. Lo he probado pero me da un error que no logro entender (el porqué). El proveedor es la Agencia de Protección de Datos, y el archivo XML es uno de prueba enviado por ellos. El código es el siguiente:

strURL = "https://www.aespd.es:443/agenciapd/axis/SolicitudService?wsdl"
SoapServer = "www.aespd.es"
SoapPath = "/agenciapd/axis/SolicitudService?wsdl"

Set oSOAPprov = CreateObject("MSXML2.ServerXMLHTTP")
oSOAPprov.Open "POST", strURL, False

oSOAPprov.setRequestHeader "Man", "POST " & strURL & " HTTP/1.1"
oSOAPprov.setRequestHeader "Host", SoapServer
oSOAPprov.setRequestHeader "Content-Type", "text/xml; charset=utf-8"
oSOAPprov.setRequestHeader "SOAPAction", "https://www.aespd.es:443/agenciapd/axis/SolicitudService"
oSOAPprov.send (parser.XML)

El resultado dice que está mal la etiqueta envio:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server.userException</faultcode>
<faultstring>org.xml.sax.SAXException: Bad envelope tag: envio</faultstring>
<detail/>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>

¿Me puedes ayudar? Gracias.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:37.