El protocolo SOAP, a pesar de lo que indica su nombre, es de todo menos sencillo.
Principalmente, su complejidad deriva del hecho de estar basado en XML, aunque no es lo único que tiene.
En teoría, es un protocolo super flexible. En la realidad… un dolor de cabeza importante.
En PHP existen varias implementaciones que intentan simplificar un poco el problema.
Las veces que me ha tocado enfrentarme a SOAP las clases SoapClient y SoapServer han estado a la altura, aunque cuando aparecieron los encabezados no fue tan sencillo.
Tomemos como ejemplo este servicio web que define el siguiente WSDL:
<?xml version="1.0" encoding="utf-8"?> <wsdl:definitions xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="https://sccnlp.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" targetNamespace="https://sccnlp.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> <wsdl:types> <s:schema elementFormDefault="qualified" targetNamespace="https://sccnlp.com/"> <s:element name="registrarNombradas"> <s:complexType> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="rutEmpresa" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="nombradas" type="tns:ArrayOfNombrada" /> </s:sequence> </s:complexType> </s:element> <s:complexType name="ArrayOfNombrada"> <s:sequence> <s:element minOccurs="0" maxOccurs="unbounded" name="Nombrada" nillable="true" type="tns:Nombrada" /> </s:sequence> </s:complexType> <s:complexType name="Nombrada"> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="fechaInicioNombrada" type="s:dateTime" /> <s:element minOccurs="1" maxOccurs="1" name="idPuerto" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="idTurno" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="idNave" nillable="true" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="idLocacion" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="trabajadores" type="tns:ArrayOfTrabajadorNombrada" /> </s:sequence> </s:complexType> <s:complexType name="ArrayOfTrabajadorNombrada"> <s:sequence> <s:element minOccurs="0" maxOccurs="unbounded" name="TrabajadorNombrada" nillable="true" type="tns:TrabajadorNombrada" /> </s:sequence> </s:complexType> <s:complexType name="TrabajadorNombrada"> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="idContrato" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="idLabor" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="idFuncion" type="s:int" /> </s:sequence> </s:complexType> <s:element name="registrarNombradasResponse"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="registrarNombradasResult" type="tns:NombradaCreada" /> </s:sequence> </s:complexType> </s:element> <s:complexType name="NombradaCreada"> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="Estado" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="Mensaje" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="nombradaCreadaDetalle" type="tns:ArrayOfNombradaCreadaDetalle" /> </s:sequence> </s:complexType> <s:complexType name="ArrayOfNombradaCreadaDetalle"> <s:sequence> <s:element minOccurs="0" maxOccurs="unbounded" name="NombradaCreadaDetalle" nillable="true" type="tns:NombradaCreadaDetalle" /> </s:sequence> </s:complexType> <s:complexType name="NombradaCreadaDetalle"> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="error" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="idEstado" type="s:int" /> </s:sequence> </s:complexType> <s:element name="UserCredentials" type="tns:UserCredentials" /> <s:complexType name="UserCredentials"> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="userName" nillable="true" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="password" nillable="true" type="s:string" /> </s:sequence> <s:anyAttribute /> </s:complexType> <s:element name="modificarNombradas"> <s:complexType> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="rutEmpresa" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="lista" type="tns:ArrayOfTrabajadorNombradaEdicion" /> </s:sequence> </s:complexType> </s:element> <s:complexType name="ArrayOfTrabajadorNombradaEdicion"> <s:sequence> <s:element minOccurs="0" maxOccurs="unbounded" name="TrabajadorNombradaEdicion" nillable="true" type="tns:TrabajadorNombradaEdicion" /> </s:sequence> </s:complexType> <s:complexType name="TrabajadorNombradaEdicion"> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="idNombrada" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="idContrato" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="idContratoNuevo" nillable="true" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="idLabor" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="idFuncion" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="activo" type="s:boolean" /> <s:element minOccurs="1" maxOccurs="1" name="rutTrabajador" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="dvTrabajador" nillable="true" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="pasaporte" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="extensionJornada" type="s:boolean" /> </s:sequence> </s:complexType> <s:element name="modificarNombradasResponse"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="modificarNombradasResult" type="tns:NombradaCreada" /> </s:sequence> </s:complexType> </s:element> <s:element name="getResolucionNombrada"> <s:complexType> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="idNombrada" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="rutEmpresa" type="s:int" /> </s:sequence> </s:complexType> </s:element> <s:element name="getResolucionNombradaResponse"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="getResolucionNombradaResult" type="tns:NombradaResolucion" /> </s:sequence> </s:complexType> </s:element> <s:complexType name="NombradaResolucion"> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="Estado" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="Mensaje" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="nombradaResolucionDetalle" type="tns:NombradaResolucionDetalle" /> </s:sequence> </s:complexType> <s:complexType name="NombradaResolucionDetalle"> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="idEmpresa" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="fechaInicioNombrada" nillable="true" type="s:dateTime" /> <s:element minOccurs="1" maxOccurs="1" name="fechaFinNombrada" nillable="true" type="s:dateTime" /> <s:element minOccurs="1" maxOccurs="1" name="idTurno" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="Turno" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="idNave" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="Nave" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="idLocacion" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="lugar" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="posicion" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="fechaCreacion" type="s:dateTime" /> <s:element minOccurs="1" maxOccurs="1" name="activo" nillable="true" type="s:boolean" /> <s:element minOccurs="1" maxOccurs="1" name="idEstadoNombrada" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="glosaEstadoNombrada" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="trabajadores" type="tns:ArrayOfTrabajadorResolucion" /> </s:sequence> </s:complexType> <s:complexType name="ArrayOfTrabajadorResolucion"> <s:sequence> <s:element minOccurs="0" maxOccurs="unbounded" name="TrabajadorResolucion" nillable="true" type="tns:TrabajadorResolucion" /> </s:sequence> </s:complexType> <s:complexType name="TrabajadorResolucion"> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="idNombrada" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="idContrato" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="idContratoNuevo" nillable="true" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="idTrabajador" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="rutTrabajador" nillable="true" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="dvTrabajador" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="pasaporte" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="nombres" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="apellidos" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="idLabor" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="idFuncion" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="estadoTrabajador" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="activo" type="s:boolean" /> <s:element minOccurs="1" maxOccurs="1" name="idEstadoTrabajador" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="extensionJornada" type="s:boolean" /> <s:element minOccurs="1" maxOccurs="1" name="horasExtras" nillable="true" type="s:double" /> <s:element minOccurs="1" maxOccurs="1" name="fechaCreacion" type="s:dateTime" /> <s:element minOccurs="1" maxOccurs="1" name="fechaFinNombradaTrabajador" type="s:dateTime" /> <s:element minOccurs="1" maxOccurs="1" name="fechaModificacion" nillable="true" type="s:dateTime" /> </s:sequence> </s:complexType> <s:element name="consultarNombrada"> <s:complexType> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="rutEmpresa" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="filtro" nillable="true" type="tns:FiltroNombrada" /> </s:sequence> </s:complexType> </s:element> <s:complexType name="FiltroNombrada"> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="idNombrada" nillable="true" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="fechaInicio" nillable="true" type="s:dateTime" /> <s:element minOccurs="0" maxOccurs="1" name="idLabor" nillable="true" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="idNave" nillable="true" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="idLocacion" nillable="true" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="rutTrabajador" nillable="true" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="dvTrabajador" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="pasaporte" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="idEstado" nillable="true" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="idFuncion" nillable="true" type="s:int" /> </s:sequence> </s:complexType> <s:element name="consultarNombradaResponse"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="consultarNombradaResult" type="tns:NombradaConsultaMuellaje" /> </s:sequence> </s:complexType> </s:element> <s:complexType name="NombradaConsultaMuellaje"> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="Estado" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="Mensaje" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="consultaDetalle" type="tns:ArrayOfNombradaOutMuellaje" /> </s:sequence> </s:complexType> <s:complexType name="ArrayOfNombradaOutMuellaje"> <s:sequence> <s:element minOccurs="0" maxOccurs="unbounded" name="NombradaOutMuellaje" nillable="true" type="tns:NombradaOutMuellaje" /> </s:sequence> </s:complexType> <s:complexType name="NombradaOutMuellaje"> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="idNombrada" nillable="true" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="fechaInicioNombrada" type="s:dateTime" /> <s:element minOccurs="1" maxOccurs="1" name="fechaFinNombrada" type="s:dateTime" /> <s:element minOccurs="1" maxOccurs="1" name="idNave" nillable="true" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="nombreNave" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="idPuerto" nillable="true" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="nombrePuerto" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="idLocacion" nillable="true" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="lugar" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="posicion" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="idTurno" nillable="true" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="glosaTurno" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="idEstadoNombrada" nillable="true" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="glosaEstadoNombrada" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="rutMuellaje" nillable="true" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="nombreMuellaje" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="rutConcesionaria" nillable="true" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="nombreConcesionario" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="NOMBRE_INSTALACION" type="s:string" /> </s:sequence> </s:complexType> <s:element name="eliminarNombrada"> <s:complexType> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="rutEmpresa" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="idNombrada" type="s:int" /> </s:sequence> </s:complexType> </s:element> <s:element name="eliminarNombradaResponse"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="eliminarNombradaResult" type="tns:Respuesta" /> </s:sequence> </s:complexType> </s:element> <s:complexType name="Respuesta"> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="Estado" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="Mensaje" type="s:string" /> </s:sequence> </s:complexType> <s:element name="consultarNombradaByConcesionaria"> <s:complexType> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="rutEmpresa" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="filtro" nillable="true" type="tns:FiltroNombrada" /> </s:sequence> </s:complexType> </s:element> <s:element name="consultarNombradaByConcesionariaResponse"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="consultarNombradaByConcesionariaResult" type="tns:NombradaConsultaConcesionario" /> </s:sequence> </s:complexType> </s:element> <s:complexType name="NombradaConsultaConcesionario"> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="Estado" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="Mensaje" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="consultaDetalle" type="tns:ArrayOfNombradaOutConcesionario" /> </s:sequence> </s:complexType> <s:complexType name="ArrayOfNombradaOutConcesionario"> <s:sequence> <s:element minOccurs="0" maxOccurs="unbounded" name="NombradaOutConcesionario" nillable="true" type="tns:NombradaOutConcesionario" /> </s:sequence> </s:complexType> <s:complexType name="NombradaOutConcesionario"> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="idNombrada" nillable="true" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="fechaInicioNombrada" type="s:dateTime" /> <s:element minOccurs="1" maxOccurs="1" name="fechaFinNombrada" type="s:dateTime" /> <s:element minOccurs="1" maxOccurs="1" name="idNave" nillable="true" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="nombreNave" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="idLocacion" nillable="true" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="lugar" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="idPuerto" nillable="true" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="nombrePuerto" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="idTurno" nillable="true" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="glosaTurno" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="posicion" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="idEstadoNombrada" nillable="true" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="glosaEstadoNombrada" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="rutMuellaje" nillable="true" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="nombreMuellaje" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="idLabor" nillable="true" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="idFuncion" nillable="true" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="rutConcesionaria" nillable="true" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="nombreConcesionaria" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="trabajadores" type="tns:ArrayOfTrabajador" /> </s:sequence> </s:complexType> <s:complexType name="ArrayOfTrabajador"> <s:sequence> <s:element minOccurs="0" maxOccurs="unbounded" name="Trabajador" nillable="true" type="tns:Trabajador" /> </s:sequence> </s:complexType> <s:complexType name="Trabajador"> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="idContrato" nillable="true" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="rutTrabajador" nillable="true" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="dvTrabajador" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="pasaporteTrabajador" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="nombresTrabajador" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="apellidoPaternoTrabajador" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="idLabor" nillable="true" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="glosaLabor" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="idFuncion" nillable="true" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="glosaFuncion" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="glosaEstadoTrabajador" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="activoTrabajador" nillable="true" type="s:boolean" /> </s:sequence> </s:complexType> <s:element name="verificarTrabajadorPortuario"> <s:complexType> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="rutEmpresa" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="rutTrabajador" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="dvTrabajador" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="fecha" type="s:dateTime" /> </s:sequence> </s:complexType> </s:element> <s:element name="verificarTrabajadorPortuarioResponse"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="verificarTrabajadorPortuarioResult" type="tns:Respuesta" /> </s:sequence> </s:complexType> </s:element> </s:schema> </wsdl:types> <wsdl:message name="registrarNombradasSoapIn"> <wsdl:part name="parameters" element="tns:registrarNombradas" /> </wsdl:message> <wsdl:message name="registrarNombradasSoapOut"> <wsdl:part name="parameters" element="tns:registrarNombradasResponse" /> </wsdl:message> <wsdl:message name="registrarNombradasUserCredentials"> <wsdl:part name="UserCredentials" element="tns:UserCredentials" /> </wsdl:message> <wsdl:message name="modificarNombradasSoapIn"> <wsdl:part name="parameters" element="tns:modificarNombradas" /> </wsdl:message> <wsdl:message name="modificarNombradasSoapOut"> <wsdl:part name="parameters" element="tns:modificarNombradasResponse" /> </wsdl:message> <wsdl:message name="modificarNombradasUserCredentials"> <wsdl:part name="UserCredentials" element="tns:UserCredentials" /> </wsdl:message> <wsdl:message name="getResolucionNombradaSoapIn"> <wsdl:part name="parameters" element="tns:getResolucionNombrada" /> </wsdl:message> <wsdl:message name="getResolucionNombradaSoapOut"> <wsdl:part name="parameters" element="tns:getResolucionNombradaResponse" /> </wsdl:message> <wsdl:message name="getResolucionNombradaUserCredentials"> <wsdl:part name="UserCredentials" element="tns:UserCredentials" /> </wsdl:message> <wsdl:message name="consultarNombradaSoapIn"> <wsdl:part name="parameters" element="tns:consultarNombrada" /> </wsdl:message> <wsdl:message name="consultarNombradaSoapOut"> <wsdl:part name="parameters" element="tns:consultarNombradaResponse" /> </wsdl:message> <wsdl:message name="consultarNombradaUserCredentials"> <wsdl:part name="UserCredentials" element="tns:UserCredentials" /> </wsdl:message> <wsdl:message name="eliminarNombradaSoapIn"> <wsdl:part name="parameters" element="tns:eliminarNombrada" /> </wsdl:message> <wsdl:message name="eliminarNombradaSoapOut"> <wsdl:part name="parameters" element="tns:eliminarNombradaResponse" /> </wsdl:message> <wsdl:message name="eliminarNombradaUserCredentials"> <wsdl:part name="UserCredentials" element="tns:UserCredentials" /> </wsdl:message> <wsdl:message name="consultarNombradaByConcesionariaSoapIn"> <wsdl:part name="parameters" element="tns:consultarNombradaByConcesionaria" /> </wsdl:message> <wsdl:message name="consultarNombradaByConcesionariaSoapOut"> <wsdl:part name="parameters" element="tns:consultarNombradaByConcesionariaResponse" /> </wsdl:message> <wsdl:message name="consultarNombradaByConcesionariaUserCredentials"> <wsdl:part name="UserCredentials" element="tns:UserCredentials" /> </wsdl:message> <wsdl:message name="verificarTrabajadorPortuarioSoapIn"> <wsdl:part name="parameters" element="tns:verificarTrabajadorPortuario" /> </wsdl:message> <wsdl:message name="verificarTrabajadorPortuarioSoapOut"> <wsdl:part name="parameters" element="tns:verificarTrabajadorPortuarioResponse" /> </wsdl:message> <wsdl:message name="verificarTrabajadorPortuarioUserCredentials"> <wsdl:part name="UserCredentials" element="tns:UserCredentials" /> </wsdl:message> <wsdl:portType name="NombradasSoap"> <wsdl:operation name="registrarNombradas"> <wsdl:input message="tns:registrarNombradasSoapIn" /> <wsdl:output message="tns:registrarNombradasSoapOut" /> </wsdl:operation> <wsdl:operation name="modificarNombradas"> <wsdl:input message="tns:modificarNombradasSoapIn" /> <wsdl:output message="tns:modificarNombradasSoapOut" /> </wsdl:operation> <wsdl:operation name="getResolucionNombrada"> <wsdl:input message="tns:getResolucionNombradaSoapIn" /> <wsdl:output message="tns:getResolucionNombradaSoapOut" /> </wsdl:operation> <wsdl:operation name="consultarNombrada"> <wsdl:input message="tns:consultarNombradaSoapIn" /> <wsdl:output message="tns:consultarNombradaSoapOut" /> </wsdl:operation> <wsdl:operation name="eliminarNombrada"> <wsdl:input message="tns:eliminarNombradaSoapIn" /> <wsdl:output message="tns:eliminarNombradaSoapOut" /> </wsdl:operation> <wsdl:operation name="consultarNombradaByConcesionaria"> <wsdl:input message="tns:consultarNombradaByConcesionariaSoapIn" /> <wsdl:output message="tns:consultarNombradaByConcesionariaSoapOut" /> </wsdl:operation> <wsdl:operation name="verificarTrabajadorPortuario"> <wsdl:input message="tns:verificarTrabajadorPortuarioSoapIn" /> <wsdl:output message="tns:verificarTrabajadorPortuarioSoapOut" /> </wsdl:operation> </wsdl:portType> <wsdl:binding name="NombradasSoap" type="tns:NombradasSoap"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="registrarNombradas"> <soap:operation soapAction="https://sccnlp.com/registrarNombradas" style="document" /> <wsdl:input> <soap:body use="literal" /> <soap:header message="tns:registrarNombradasUserCredentials" part="UserCredentials" use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> <wsdl:operation name="modificarNombradas"> <soap:operation soapAction="https://sccnlp.com/modificarNombradas" style="document" /> <wsdl:input> <soap:body use="literal" /> <soap:header message="tns:modificarNombradasUserCredentials" part="UserCredentials" use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> <wsdl:operation name="getResolucionNombrada"> <soap:operation soapAction="https://sccnlp.com/getResolucionNombrada" style="document" /> <wsdl:input> <soap:body use="literal" /> <soap:header message="tns:getResolucionNombradaUserCredentials" part="UserCredentials" use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> <wsdl:operation name="consultarNombrada"> <soap:operation soapAction="https://sccnlp.com/consultarNombrada" style="document" /> <wsdl:input> <soap:body use="literal" /> <soap:header message="tns:consultarNombradaUserCredentials" part="UserCredentials" use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> <wsdl:operation name="eliminarNombrada"> <soap:operation soapAction="https://sccnlp.com/eliminarNombrada" style="document" /> <wsdl:input> <soap:body use="literal" /> <soap:header message="tns:eliminarNombradaUserCredentials" part="UserCredentials" use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> <wsdl:operation name="consultarNombradaByConcesionaria"> <soap:operation soapAction="https://sccnlp.com/consultarNombradaByConcesionaria" style="document" /> <wsdl:input> <soap:body use="literal" /> <soap:header message="tns:consultarNombradaByConcesionariaUserCredentials" part="UserCredentials" use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> <wsdl:operation name="verificarTrabajadorPortuario"> <soap:operation soapAction="https://sccnlp.com/verificarTrabajadorPortuario" style="document" /> <wsdl:input> <soap:body use="literal" /> <soap:header message="tns:verificarTrabajadorPortuarioUserCredentials" part="UserCredentials" use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:binding name="NombradasSoap12" type="tns:NombradasSoap"> <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="registrarNombradas"> <soap12:operation soapAction="https://sccnlp.com/registrarNombradas" style="document" /> <wsdl:input> <soap12:body use="literal" /> <soap12:header message="tns:registrarNombradasUserCredentials" part="UserCredentials" use="literal" /> </wsdl:input> <wsdl:output> <soap12:body use="literal" /> </wsdl:output> </wsdl:operation> <wsdl:operation name="modificarNombradas"> <soap12:operation soapAction="https://sccnlp.com/modificarNombradas" style="document" /> <wsdl:input> <soap12:body use="literal" /> <soap12:header message="tns:modificarNombradasUserCredentials" part="UserCredentials" use="literal" /> </wsdl:input> <wsdl:output> <soap12:body use="literal" /> </wsdl:output> </wsdl:operation> <wsdl:operation name="getResolucionNombrada"> <soap12:operation soapAction="https://sccnlp.com/getResolucionNombrada" style="document" /> <wsdl:input> <soap12:body use="literal" /> <soap12:header message="tns:getResolucionNombradaUserCredentials" part="UserCredentials" use="literal" /> </wsdl:input> <wsdl:output> <soap12:body use="literal" /> </wsdl:output> </wsdl:operation> <wsdl:operation name="consultarNombrada"> <soap12:operation soapAction="https://sccnlp.com/consultarNombrada" style="document" /> <wsdl:input> <soap12:body use="literal" /> <soap12:header message="tns:consultarNombradaUserCredentials" part="UserCredentials" use="literal" /> </wsdl:input> <wsdl:output> <soap12:body use="literal" /> </wsdl:output> </wsdl:operation> <wsdl:operation name="eliminarNombrada"> <soap12:operation soapAction="https://sccnlp.com/eliminarNombrada" style="document" /> <wsdl:input> <soap12:body use="literal" /> <soap12:header message="tns:eliminarNombradaUserCredentials" part="UserCredentials" use="literal" /> </wsdl:input> <wsdl:output> <soap12:body use="literal" /> </wsdl:output> </wsdl:operation> <wsdl:operation name="consultarNombradaByConcesionaria"> <soap12:operation soapAction="https://sccnlp.com/consultarNombradaByConcesionaria" style="document" /> <wsdl:input> <soap12:body use="literal" /> <soap12:header message="tns:consultarNombradaByConcesionariaUserCredentials" part="UserCredentials" use="literal" /> </wsdl:input> <wsdl:output> <soap12:body use="literal" /> </wsdl:output> </wsdl:operation> <wsdl:operation name="verificarTrabajadorPortuario"> <soap12:operation soapAction="https://sccnlp.com/verificarTrabajadorPortuario" style="document" /> <wsdl:input> <soap12:body use="literal" /> <soap12:header message="tns:verificarTrabajadorPortuarioUserCredentials" part="UserCredentials" use="literal" /> </wsdl:input> <wsdl:output> <soap12:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="Nombradas"> <wsdl:port name="NombradasSoap" binding="tns:NombradasSoap"> <soap:address location="https://sccnlpservices-piloto.dirtrab.cl/Servicios/Nombradas.asmx" /> </wsdl:port> <wsdl:port name="NombradasSoap12" binding="tns:NombradasSoap12"> <soap12:address location="https://sccnlpservices-piloto.dirtrab.cl/Servicios/Nombradas.asmx" /> </wsdl:port> </wsdl:service> </wsdl:definitions>
Con esta información puedes armar un script como este:
<?php $url = "https://sccnlpservices-piloto.dirtrab.cl/Servicios/Nombradas.asmx?WSDL"; $client = new SoapClient($url, ["trace" => 1, "exception" => 0]); print_r($client->__getFunctions());
Y, al correrlo obtendrás algo como:
Array ( [0] => registrarNombradasResponse registrarNombradas(registrarNombradas $parameters) [1] => modificarNombradasResponse modificarNombradas(modificarNombradas $parameters) [2] => getResolucionNombradaResponse getResolucionNombrada(getResolucionNombrada $parameters) [3] => consultarNombradaResponse consultarNombrada(consultarNombrada $parameters) [4] => eliminarNombradaResponse eliminarNombrada(eliminarNombrada $parameters) [5] => consultarNombradaByConcesionariaResponse consultarNombradaByConcesionaria(consultarNombradaByConcesionaria $parameters) [6] => verificarTrabajadorPortuarioResponse verificarTrabajadorPortuario(verificarTrabajadorPortuario $parameters) [7] => registrarNombradasResponse registrarNombradas(registrarNombradas $parameters) [8] => modificarNombradasResponse modificarNombradas(modificarNombradas $parameters) [9] => getResolucionNombradaResponse getResolucionNombrada(getResolucionNombrada $parameters) [10] => consultarNombradaResponse consultarNombrada(consultarNombrada $parameters) [11] => eliminarNombradaResponse eliminarNombrada(eliminarNombrada $parameters) [12] => consultarNombradaByConcesionariaResponse consultarNombradaByConcesionaria(consultarNombradaByConcesionaria $parameters) [13] => verificarTrabajadorPortuarioResponse verificarTrabajadorPortuario(verificarTrabajadorPortuario $parameters) )
Ahora bien, digamos que quieres ejecutar una función como consultarNombrada
.
Podrías hacerlo de esta forma:
$response = $client->getResolucionNombrada([ 'idNombrada' => 1, 'rutEmpresa' => 2 ]);
Pero, al correrlo obtendrás un error similar a:
SOAP Fault: Fault Code: soap:Server Fault String: System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.NullReferenceException: Object reference not set to an instance of an object. at Services.Servicios.Nombradas.getResolucionNombrada(Int32 idNombrada, Int32 rutEmpresa) in C:\VSTS-Apl-Agent\_work\48\s\SCCNLP_Services\Services\Servicios\Nombradas.asmx.cs:line 144 --- End of inner exception stack trace ---
¿Qué ha ocurrido? ¿Es un problema del lado del webservice?
No. Simplemente, no configuraste la autenticación, por lo tanto, la llamada falla.
Si miras nuevamente el WSDL verás esta definición:
<soap:header message="tns:registrarNombradasUserCredentials" part="UserCredentials" use="literal"/>
Que indica que, como parte de la llamada, es necesario especificar un encabezado llamado tns:registrarNombradasUserCredentials
Este elemento usa la definición que aparece al comienzo (En la parte de los tipos):
<s:complexType name="UserCredentials"> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="userName" nillable="true" type="s:string"/> <s:element minOccurs="1" maxOccurs="1" name="password" nillable="true" type="s:string"/> </s:sequence> <s:anyAttribute/> </s:complexType>
Es decir que, para que la llamada tenga éxito, debes incluir la información de autenticación (userName
y password
) como un encabezado SOAP.
Puedes lograr esto agregando lo siguiente a tu código:
$client->__setSoapHeaders([ new SoapHeader( "https://sccnlp.com/", "UserCredentials", [ "userName" => "XXXX", "password" => "YYYY", ] ) ]);
Y, asumiendo que tengas datos correctos para realizar la autenticación y que tu usuario tenga los permisos requeridos, obtendrás la información que buscas.
Algo interesante de hacer este ajuste de esta forma es que los datos de autenticación estarán disponibles para todas las subsiguientes llamadas al servicio.
- Cómo enviarencabezados SOAP desde PHP - 09/12/2024
- Por qué PHP 8 no satisface el requisito ^7.3 de composer - 09/12/2024
- Cómo usar PHPUnit - 03/12/2024