// // 2 comentarios

Consumir datos del webservice a través de SAP PI sin WSDL

Recuerdo que en un proyecto SAP renegamos mucho con el consumo de datos provenientes de un XML, y los famosos WebServices. Así que cuando leí el artículo que escribió Abhishek Shrotriya, para CodeProject me sentí feliz, feliz de poder re-postear esto en español e inmortalizarlo en nuestra web para que en el futuro no tener que renegar tanto entre consultores SAP y desarrolladores (a falta de un buen consultor SAP PI). ;)

Comunicación .NET webservice y SAP

El autor nos indica que si tenemos el requerimiento de consumir datos a través de webservice, a continuación veremos un forma simple para conectar al web service sin WSDL o sin agregar ninguna referencia a nuestra solución .NET.

Así que usando HttpWebRequest, intentó conectarse con un webservice y encontrar datos como definirá a continuación.




El código

Crear el objeto HttpWebRequest proporcionando cabecera SOAP y crear el body (que tiene que enviar al servicio web como una entrada o input) del web service como POST request.


HttpWebRequest request = CreateWebRequest();
XmlDocument soapEnvelopeXml = new XmlDocument();
soapEnvelopeXml.LoadXml(@"

  
    ...
  
");

Crear un método privado (private) que podemos denominar CreateWebRequest para llenar la cabecera con la información que traiga.


private static HttpWebRequest CreateWebRequest()
{
 HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create
 (@"WebServiceEndPointURL");
 webRequest.Headers.Add(@"SOAP:Action");
 webRequest.ContentType = "text/xml;charset=\"utf-8\"";
 webRequest.Accept = "text/xml";
 webRequest.Method = "POST";
 string authorization = "username" + 
 ":" + "password";
 byte[] binaryAuthorization = System.Text.Encoding.UTF8.GetBytes(autorization);
 authorization = Convert.ToBase64String(binaryAuthorization);
 authorization = "Basic " + authorization;
 webRequest.Headers.Add("AUTHORIZATION", authorization);
 return webRequest;
}


Se podrá utilizar el siguiente código para interactuar con el webservice y SAP PI. Si hay problemas, el código a continuación le ayudará a identificar la causa exacta del problema, será muy útil si el web service se usa en entornos diferentes.


using (Stream stream = request.GetRequestStream())
{
    soapEnvelopeXml.Save(stream);
}
try
{
    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    {
        using (StreamReader rd = new StreamReader(response.GetResponseStream()))
        {
            string soapResult = rd.ReadToEnd();
            ...here you can write the business logic implementation....
        }
    }
}
catch (Exception e)
{
    if (e is WebException && ((WebException)e).Status == WebExceptionStatus.ProtocolError)
    {
        WebResponse errResp = ((WebException)e).Response;
        using (Stream respStream = errResp.GetResponseStream())
        {
            using (StreamReader rd = new StreamReader(respStream))
            {
                string soapResult = rd.ReadToEnd();
            }
        }
    }
}


Si tienen dudas, pueden lanzarlas a nuestra plataforma de ayuda SAP, es gratis!

Todos los derechos reservados a CodeProject.

2 comentarios:

  1. Buen aporte tienes la url del artículo original?

    ResponderBorrar
    Respuestas
    1. Hola Daniel, gracias por tu comentario.
      Al final de éste artículo, está el enlace a CodeProject. :)
      No puedes verlo?

      Borrar

Nota Importante: los comentarios son para agradecer, comentar o sugerir cambios (o hacer preguntas) sobre el artículo de arriba.


SAP y el logotipo de SAP son marcas comerciales registradas de SAP AG en Alemania y en varios otros países. No estamos afiliados ni relacionados con ninguna división o subsidiaria de SAP AG.