Add Guía para generar y consumir el WSDL del servicio

marianozunino 2025-05-05 22:31:09 -03:00
parent b6be281f59
commit 8e8c21538f

@ -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
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ObtDocDigitalizado xmlns="http://dnic.gub.uy/">
<param>
<NroDocumento>49746161</NroDocumento>
<TipoDocumento>DO</TipoDocumento>
<NroSerie>ABC123456</NroSerie>
<NroIdentificacion>123456</NroIdentificacion>
<Organismo>ServiPuntos</Organismo>
<ClaveAcceso1>Clave123</ClaveAcceso1>
</param>
</ObtDocDigitalizado>
</soap:Body>
</soap:Envelope>
```
#### Ejemplo de respuesta SOAP (éxito)
```xml
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<s:Body>
<ObtDocDigitalizadoResponse xmlns="http://dnic.gub.uy/">
<ObtDocDigitalizadoResult>
<Persona>
<CodTipoDocumento>DO</CodTipoDocumento>
<NroDocumento>49746161</NroDocumento>
<Nombre1>Jimena</Nombre1>
<Nombre2>Marta</Nombre2>
<PrimerApellido>Moreira</PrimerApellido>
<SegundoApellido>Morales</SegundoApellido>
<Sexo>2</Sexo>
<FechaNacimiento>1963-10-28</FechaNacimiento>
<CodNacionalidad>2</CodNacionalidad>
<NombreEnCedula>Jimena Marta Moreira Morales</NombreEnCedula>
<IdSolicitud>88726</IdSolicitud>
<IdRespuesta>77134</IdRespuesta>
</Persona>
<Imagenes>
<ImagenDigital>
<Foto>No Implementado...</Foto>
<LargoBytes>254</LargoBytes>
<TipoImagen>1</TipoImagen>
</ImagenDigital>
<ImagenDigital>
<Foto>No Implementado...</Foto>
<LargoBytes>282</LargoBytes>
<TipoImagen>2</TipoImagen>
</ImagenDigital>
</Imagenes>
</ObtDocDigitalizadoResult>
</ObtDocDigitalizadoResponse>
</s:Body>
</s:Envelope>
```
#### Ejemplo de respuesta SOAP (error)
```xml
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<s:Body>
<ObtDocDigitalizadoResponse xmlns="http://dnic.gub.uy/">
<ObtDocDigitalizadoResult>
<Errores>
<Mensaje>
<CodMensaje>1001</CodMensaje>
<Descripcion>Persona inexistente en la base de datos</Descripcion>
<DatoExtra>Trace</DatoExtra>
</Mensaje>
</Errores>
</ObtDocDigitalizadoResult>
</ObtDocDigitalizadoResponse>
</s:Body>
</s:Envelope>
```
## 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.