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). ;)
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.
Buen aporte tienes la url del artículo original?
ResponderBorrarHola Daniel, gracias por tu comentario.
BorrarAl final de éste artículo, está el enlace a CodeProject. :)
No puedes verlo?