diff --git a/Gu%C3%ADa-para-generar-y-consumir-el-WSDL-del-servicio.md b/Gu%C3%ADa-para-generar-y-consumir-el-WSDL-del-servicio.md new file mode 100644 index 0000000..9de6560 --- /dev/null +++ b/Gu%C3%ADa-para-generar-y-consumir-el-WSDL-del-servicio.md @@ -0,0 +1,305 @@ +# Guía para generar y consumir el WSDL del servicio + +Este documento describe cómo acceder al WSDL del servicio de simulación de documentos digitalizados y cómo consumirlo desde diferentes plataformas. + +## ¿Qué es WSDL? + +WSDL (Web Services Description Language) es un formato XML que describe la funcionalidad ofrecida por un servicio web SOAP. Permite a los clientes entender automáticamente cómo interactuar con el servicio. + +## Acceso al WSDL + +Una vez que el servicio está en ejecución, el WSDL está disponible en las siguientes URLs: + +- Para el endpoint con DataContractSerializer: + ``` + http://localhost:5050/WsServicioDeInformacion.svc?wsdl + ``` + +- Para el endpoint con XmlSerializer: + ``` + http://localhost:5050/WsServicioDeInformacion.asmx?wsdl + ``` + +En un entorno de producción, la URL sería similar a la siguiente: +``` +https://dnic.mz.uy/WsServicioDeInformacion.asmx?wsdl +``` + +## Consumo del servicio SOAP + +Existen múltiples formas de consumir un servicio SOAP, dependiendo de la plataforma y el lenguaje de programación. + +### Usando SoapUI (herramienta de pruebas) + +1. Descarga e instala [SoapUI](https://www.soapui.org/) +2. Crea un nuevo proyecto SOAP +3. En la URL del WSDL, introduce la URL del servicio (ej. `http://localhost:5050/WsServicioDeInformacion.asmx?wsdl`) +4. SoapUI generará automáticamente las solicitudes de ejemplo para cada operación + +### Usando Postman + +1. Abre Postman y crea una nueva solicitud +2. Establece el método a POST +3. Introduce la URL del servicio (ej. `http://localhost:5050/WsServicioDeInformacion.asmx`) +4. En Headers, agrega `Content-Type: text/xml` +5. En el cuerpo, coloca tu solicitud SOAP + +### Ejemplos de solicitud y respuesta + +#### Ejemplo de solicitud SOAP + +```xml + + + + + 49746161 + DO + ABC123456 + 123456 + ServiPuntos + Clave123 + + + + +``` + +#### Ejemplo de respuesta SOAP (éxito) + +```xml + + + + + + DO + 49746161 + Jimena + Marta + Moreira + Morales + 2 + 1963-10-28 + 2 + Jimena Marta Moreira Morales + 88726 + 77134 + + + + No Implementado... + 254 + 1 + + + No Implementado... + 282 + 2 + + + + + + +``` + +#### Ejemplo de respuesta SOAP (error) + +```xml + + + + + + + 1001 + Persona inexistente en la base de datos + Trace + + + + + + +``` + +## Consumo del servicio desde diferentes lenguajes + +### C# + +```csharp +// Agregar referencia al servicio: +// dotnet add package System.ServiceModel.Http +// dotnet add package System.ServiceModel.Primitives + +using System; +using System.ServiceModel; +using System.Threading.Tasks; + +// Generar cliente del servicio usando: +// dotnet tool install --global dotnet-svcutil +// dotnet-svcutil http://localhost:5050/WsServicioDeInformacion.asmx?wsdl + +class Program +{ + static async Task Main() + { + // Crear el cliente + var binding = new BasicHttpBinding(); + var endpoint = new EndpointAddress("http://localhost:5050/WsServicioDeInformacion.asmx"); + var client = new WsServicioDeInformacionClient(binding, endpoint); + + // Crear parámetros + var param = new ParamObtDocDigitalizado + { + NroDocumento = "49746161", + TipoDocumento = "DO", + NroSerie = "ABC123456", + Organismo = "ServiPuntos", + ClaveAcceso1 = "Clave123" + }; + + // Llamar al servicio + var result = await client.ObtDocDigitalizadoAsync(param); + + // Procesar resultado + if (result.Errores != null && result.Errores.Length > 0) + { + Console.WriteLine($"Error: {result.Errores[0].Descripcion}"); + } + else + { + Console.WriteLine($"Nombre: {result.Persona.Nombre1} {result.Persona.PrimerApellido}"); + } + } +} +``` + +### Java + +```java +// Usar JAX-WS o wsimport para generar clases cliente +// wsimport -keep -p uy.gub.dnic http://localhost:5050/WsServicioDeInformacion.asmx?wsdl + +import uy.gub.dnic.*; + +public class Main { + public static void main(String[] args) { + try { + // Crear el servicio y el puerto + WsServicioDeInformacion service = new WsServicioDeInformacion(); + IWsServicioDeInformacion port = service.getBasicHttpBindingIWsServicioDeInformacion(); + + // Crear parámetros + ParamObtDocDigitalizado param = new ParamObtDocDigitalizado(); + param.setNroDocumento("49746161"); + param.setTipoDocumento("DO"); + param.setNroSerie("ABC123456"); + param.setOrganismo("ServiPuntos"); + param.setClaveAcceso1("Clave123"); + + // Llamar al servicio + ResultObtDocDigitalizado result = port.obtDocDigitalizado(param); + + // Procesar resultado + if (result.getErrores() != null && !result.getErrores().getMensaje().isEmpty()) { + System.out.println("Error: " + result.getErrores().getMensaje().get(0).getDescripcion()); + } else { + System.out.println("Nombre: " + result.getPersona().getNombre1() + " " + + result.getPersona().getPrimerApellido()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } +} +``` + +### Python (con zeep) + +```python +from zeep import Client + +# Crear cliente SOAP +client = Client('http://localhost:5050/WsServicioDeInformacion.asmx?wsdl') + +# Preparar parámetros +param = { + 'NroDocumento': '49746161', + 'TipoDocumento': 'DO', + 'NroSerie': 'ABC123456', + 'Organismo': 'ServiPuntos', + 'ClaveAcceso1': 'Clave123' +} + +# Llamar al servicio +result = client.service.ObtDocDigitalizado(param) + +# Procesar resultado +if hasattr(result, 'Errores') and result.Errores: + print(f"Error: {result.Errores[0].Descripcion}") +else: + print(f"Nombre: {result.Persona.Nombre1} {result.Persona.PrimerApellido}") +``` + +### JavaScript/TypeScript (con node-soap) + +```javascript +const soap = require('soap'); +const url = 'http://localhost:5050/WsServicioDeInformacion.asmx?wsdl'; + +// Crear cliente SOAP +soap.createClient(url, function(err, client) { + if (err) { + console.error(err); + return; + } + + // Preparar parámetros + const param = { + NroDocumento: '49746161', + TipoDocumento: 'DO', + NroSerie: 'ABC123456', + Organismo: 'ServiPuntos', + ClaveAcceso1: 'Clave123' + }; + + // Llamar al servicio + client.ObtDocDigitalizado({ param }, function(err, result) { + if (err) { + console.error(err); + return; + } + + const response = result.ObtDocDigitalizadoResult; + + // Procesar resultado + if (response.Errores) { + console.log(`Error: ${response.Errores.Mensaje.Descripcion}`); + } else { + console.log(`Nombre: ${response.Persona.Nombre1} ${response.Persona.PrimerApellido}`); + } + }); +}); +``` + +## Manipular el CI para obtener diferentes resultados + +Como se explicó en el README principal, los primeros dígitos de la cédula determinan el comportamiento del servicio: + +| Primeros dos dígitos | Resultado | +|----------------------|-----------| +| 11 | Error - Persona inexistente | +| 12 | Error - Límite de consultas excedido | +| 13 | Error - Número de cédula anulado | +| 14 | Advertencia - Datos de persona a regularizar | +| 15 | Advertencia - Documento hurtado o extraviado | + +Además, los últimos dos dígitos determinan la edad de la persona. Por ejemplo: + +- CI terminada en "18": Persona de 18 años +- CI terminada en "25": Persona de 25 años +- CI terminada en "65": Persona de 65 años + +Para probar diferentes escenarios, simplemente modifique el número de cédula en la solicitud SOAP.Welcome to the Wiki. \ No newline at end of file