Herramientas personales

DevApps:SOAP Development

De DeisterWiki

Saltar a: navegación, buscar

Contenido

[editar] 1 SOAP Services

El sistema de aplicaciones WebStudio integra la tecnología SOAP basada en el la implementación del proyecto Apache. Dado que los servicios (servlets) SOAP de WebStudio se ejecutan como servicios web, los clientes de estos servicios pueden beneficiarse de los mecanismos de alta disponibilidad de WebStudio creando un cluster de servidores (un grupo de servidores WebStudio ejecutándose en diferentes equipos), los clientes que accedan a estos servicios mediante un redirector pueden cambiar automáticamente a otro cuando el intento de conexión a uno ha fallado. Un conjunto de cuatro servicios SOAP integrados en el núcleo del sistema permiten a aplicaciones externas interactuar con el sistema de aplicaciones.

La siguiente lista muestra los servicios disponibles:

  • SOAPSQLServer Permite ejecutar sentencias SQL en sistemas heterogéneos de base de datos, incluyendo transacciones.
  • SOAPOBJServer Permite ejecutar objetos complejos registrados en el servidor.
  • SOAPAPPServer Permite ejecutar operaciones relacionados con los recursos disponibles para el usuario como bases de datos, menus, roles, etc.
  • SOAPXMLServer Permite ejecutar tanto sentencias XSQL como procesos XSQL-SCRIPT.

Puede encontrar los descriptores WSDL en su servidor accediendo a http://hostname/soap

Web Services

[editar] 1.1 SOAPAPPServer

Este servicio web nos ofrece la posibilidad de interrogar el sistema de aplicaciones WebStudio sobre los recursos accesibles por el usuario como bases de datos, menús, roles, etc. Y además nos permite realizar operaciones relaciones con el entorno de trabajo del usuario como escritorios, canales, disco, etc.

La siguiente tabla muestra las funciones implementadas por el servicio SOAPAPPServer:

Recursos generales
Función Return Descripción
getPolicy() java.util.HashMap<String, Object> Retorna parejas de clave valor (HashMap) del perfil de usuario como lang, date_format, etc. correspondientes al escritorio principal.
getPolicy(int desk) java.util.HashMap<String, Object> Retorna parejas de clave valor (HashMap) del perfil de usuario como lang, date_format, etc. correspondientes al escritorio que se le pasa como parámetro y a la vez lo asigna como nuevo escritorio principal.
getPolicy(String uuid, ArrayList<String[]> deviceinfo) java.util.HashMap<String, Object> Retorna parejas de clave valor (HashMap) del perfil de usuario como lang, date_format, etc. correspondientes al escritorio principal, pasando le además los parámetros del dispositivo móvil por el cual se solicita el servicio.
getRoles() String[] Retorna un Array con los roles de aplicación asignados al usuario. Obselto, en su lugar podemos usar la función getPolicy.
getServers() org.w3c.dom.Element(ResultSet) Retorna un XML con los datos principales de los servidores de base de datos registrados en el sistema de aplicaciones WebStudio y son accesibles para el usuario. Solo retorna aquellos servidores que no estén actualmente bloqueados y que el usuario tenga por lo menos autorización de acceso a alguna de las bases de datos pertenecientes al servidor a través del servicio SOAP.
getDatabases() org.w3c.dom.Element(ResultSet) Retorna un XML con los datos principales de las base de datos registrados en el sistema de aplicaciones WebStudio y son accesibles para el usuario. Solo se retorna aquellas bases de datos accesibles para el usuario y la dirección IP de la petición SOAP, y que tengan autorizado el acceso a través de SOAP.
getDatabases(String server) org.w3c.dom.Element(ResultSet) Retorna un XML igual que la anterior función por solo de un servidor.
getPanel(String dbms) org.w3c.dom.Element(Panel) Retorna un XML que describe los valores como nombre, url, etc. de la base de datos que recibe como parámetro.
getPanel(String dbms, String code, String root) org.w3c.dom.Element(Panel) Retorna un XML que describe los valores como nombre, url, etc. de la base de datos, panel raíz y panel que recibe como parámetros.
getMenu(String dbms, String code, String root) org.w3c.dom.Element(Menu) Retorna un XML que describe los valores como url, nombre, servicio, etc. de la base de datos, carpeta raíz y carpeta que recibe como parámetros.
setDesk(int desk) void Establece el número de escritorio que se le pasa como parámetro como el principal para los conexiones SOAP.
getMessagesBoard() org.w3c.dom.Element(ResultSet) Retorna un XML con los mensajes activos sin confirmar por el usuario.
acceptMessageBoard(int id) org.w3c.dom.Element(ResultSet) Confirma el mensaje cuyo identificador recibe como parámetro y retorna un XML con el resto de los mensajes pendientes de confirmar por el usuario.
getPortalBoxes() org.w3c.dom.Element(ResultSet) Retorna un XML con los datos de los canales definidos por el usuario en el escritorio principal para los conexiones SOAP.
getPortalChannel(int deskid, int boxid, String dbms, boolean invalidate) org.w3c.dom.Element(ResultSet) Retorna un XML con los datos del canal correspondiente a un escritorio SOAP cuya identificación se le pasa como parámetros.
getPortalChannel(int deskid, int boxid, String dbms, boolean invalidate, HashMap<String, String> vars) org.w3c.dom.Element(ResultSet) Retorna un XML con los datos del canal correspondiente a un escritorio SOAP cuya identificación se le pasa como parámetros, y a al vez se le pasa las variables requeridas para la ejecución del mismo.
getPortalChannelAs(int deskid, int boxid, String dbms, String type, boolean invalidate) byte[] Retorna los bytes con los datos del canal correspondiente a un escritorio SOAP cuya identificación se le pasa como parámetros, y el tipo de presenteación (csv,xlsx o pdf).
getUsers() org.w3c.dom.Element(ResultSet) Retorna un XML con los datos relacionados con los usuarios que pertenecen al mismo grupo que el usuario que solicita el servicio.
findObject(String dbms, String find) org.w3c.dom.Element(ResultSet) Dada una base datos y un patrón de búsqueda retorna un XML con los objetos encontrados.
addGeoPosition(double latitude, double longitude, double altitude, double accuracy, double speed, double distance, java.util.Date time) void Añade un registro en la tabla de posiciones geoespaciales para el usuario que solicita el servicio.
addGeoPosition(String[] provider, int[] track_id, double[] latitude, double[] longitude, double[] altitude, double[] accuracy, double[] speed, double[] bearing, double[] distance, java.util.Date[] time) void Añade varios registros en la tabla de posiciones geoespaciales para el usuario que solicita el servicio.
listFiles(String tool, String path, boolean expand) org.w3c.dom.Element(ResultSet) Retorna un nodo XML con la lista de los ficheros contenidos en la utilidad y la ruta que se le pasan como parámetros. En el primer parámetro se indica la utilidad disk o mail, el segundo la ruta de los ficheros a listar y con el último se expande o no el directorio raíz.
listFiles(String tool, String path, boolean expand, int desk_id) org.w3c.dom.Element(ResultSet) Es igual que la función anterior, salvo que aquí se puede indicar el escritorio. Es útil a la hora de recuperar para la utilidad de favoritos en que escritorio se visualizan.
getFileData(String tool, String path) byte[] Retorna el contenido de un fichero almacenado en la utilidad y la ruta que se le pasan como parámetros. En el primer parámetro se indica la utilidad disk o mail y el segundo la ruta del fichero.
getFileDataDH(String tool, String path) javax.activation.DataHandler Retorna el contenido de un fichero almacenado en la utilidad y la ruta que se le pasan como parámetros. En el primer parámetro se indica la utilidad disk o mail y el segundo la ruta del fichero.
setFileData(String tool, String path, String type, byte[] data) int Introduce el contenido de un fichero en la utilidad y la ruta que se le pasan como parámetros. En el primer parámetro se indica la utilidad disk o mail, el segundo la ruta del fichero y en el último el contenido. Retorna la cantidad de bytes introducidos.
setFileData(String tool, String path, DataHandler data) int Introduce el contenido de un fichero en la utilidad y la ruta que se le pasan como parámetros. En el primer parámetro se indica la utilidad disk o mail, el segundo la ruta del fichero y en el último el contenido. Retorna la cantidad de bytes introducidos.
deleteFile(String tool, String path) boolean Borra el contenido ubicado en alguna de las carpetas dentro de las utilidades de WebStudio. Retorna true si el registro ha sido eliminado con exíto.
renameTo(String tool, String path1, String path2) boolean Renombra un fichero. Retorna true si el registro ha sido renombrado con exíto.
mkdir(String tool, String path) boolean Crea una nueva carpeta dentro de las utilidades de WebStudio. Retorna true si la carpeta ha sido creada con exito.
mkdirs(String tool, String path) boolean Es igual que la función anterior salvo que aquí si alguna carpeta de la ruta indicada no existe también se crea.
getMailText(String path) String Retorna el contenido de un email.
getMailPart(String path, int part) javax.activation.DataHandler Retorna el contenido de un email.
OLAP
Función Return Descripción
getOLAPSchemas(String dbms) ArrayList<String[]> Retorna una Array con los código de OLAP Schemas asociados a la base de datos que se le pasa como parámetro.
getOLAPSchema(String dbms, String schema) org.w3c.dom.Element Retorna un XML con la definición del schema OLAP que se le pasa como parámetro.
getOLAPUniqueMembers(String dbms, String schema, String cube, String column) SQLResponseWrapper
executeOLAPQuery(String dbms, String schema, String cube, String[] cols, String[] rows, int removeFlag) SQLResponseWrapper
executeOLAPQuery(String dbms, String schema, String cube, String[] cols, String[] rows, String[] filters, int remove_flag, String[] nfilter_levels, String[] nfilter_measures, String[] nfilter_rules, int[] nfilter_count) SQLResponseWrapper
executeOLAPDrillThrough(String dbms, String schema, String cube, String[] measures, String[] filters) SQLResponseWrapper
getOlapHistory(String dbms) SQLResponseWrapper
getOlapFavorites(String dbms) SQLResponseWrapper
Sincronización
Función Return Descripción
getSyncTables(String client_id, HashMap<String, Integer> table_rows) org.w3c.dom.Element
uploadPlusDownload(String client_id, String[] array_of_tables, Vector<String[]> array_of_colnames, Vector<Vector<Object[]>> array_of_rows, String script) SQLResponseWrapper
uploadTable(String client_id, String table, String[] colnames, Vector<Object[]> rows) int Retorna el número de registros procesados.
downloadTable(String client_id,String client_database,String table_name,String client_table_mode,String client_table_md5,String client_k_column,java.util.Date client_table_last_sync,HashMap<String, String> vars) javax.mail.internet.MimeBodyPart
donwloadTableDone(String client_id, String dbms_code, String table_name, int t_rows, int t_network, int t_process, String errmsg) void
getRemoteCommand(String command) void
setRemoteCommand(String client_id, String command, String result) void
Transacciones
Función Return Descripción
queueInsert(String dbms, String table, String[] dd_name, int[] dd_type, Object[] dd_data) int
queueUpdate(String dbms, String table, String[] dd_name, int[] dd_type, Object[] dd_data, String[] pk_name, int[] pk_type, Object[] pk_data) int
queueDelete(String dbms, String table, String[] pk_name, int[] pk_type, Object[] pk_data) int
queueCall(String dbms, String stmt) int
queueStatus(int message) int
executeInsert(String dbms, String table, String[] dd_name, int[] dd_type, Object[] dd_data) org.w3c.dom.Element
executeUpdate(String dbms, String table, String[] dd_name, int[] dd_type, Object[] dd_data, String[] pk_name, int[] pk_type, Object[] pk_data) org.w3c.dom.Element
executeDelete(String dbms, String table, String[] pk_name, int[] pk_type, Object[] pk_data) org.w3c.dom.Element
executeCall(String dbms, String stmt) org.w3c.dom.Element
executeQuery(String dbms, String stmt) org.w3c.dom.Element

[editar] 1.2 SOAPSQLServer

Este servicio web nos ofrece la posibilidad de ejecutar sentencias SQL sobre las bases de datos definidas en el sistema de aplicaciones WebStudio y el usuario tenga los privilegios necesarios para ejecutarlas.

La siguiente tabla muestra las funciones implementdas por el servicio SOAPSQLServer:

Única sentencia
Función Return Descripción
executeQuery(String database, String sqlcmd) java.util.Hashtable<String, Object> Permite ejecutar consultas SQL cuyo resultado es una fila con una o más columnas. En el caso de que la consulta devuelva más de una fila se producirá una excepción SOAP del tipo: A subquery has returned more than one row. Retorna parejas de clave valor (Hashtable) con el nombre de la columna.
executeSQL(String database, String sqlcmd) org.w3c.dom.Element(ResultSet) Permite ejecutar cualquier sentencia SQL. Retorna un XML con el resultado.
executeSQL(String database, String sqlcmd, boolean gzip) org.w3c.dom.Element(ResultSet) Permite ejecutar cualquier sentencia SQL igual que la función anterior con la posibilidad de obtener el resultado en un XML comprimido.
executeSQL(String database, String sqlcmd, Vector<Integer> sqltype, Vector<Object> sqldata) org.w3c.dom.Element(ResultSet) Ejecuta una operación SQL unitaria a la que se pueden pasar valores para los marcadores ? de la sentencia SQL. El parámetro sqltype índica los tipos de datos (java.sql.Types) y sqldata los valores.
executeSQL(String database, String sqlcmd, Vector<Integer> sqltype, Vector<Object> sqldata, boolean gzip) org.w3c.dom.Element(ResultSet) Ejecuta una operación SQL unitaria a la que se pueden pasar valores para los marcadores ? de la sentencia SQL. El parámetro sqltype índica los tipos de datos (java.sql.Types) y sqldata los valores.
executeSQL(String database, String sqlcmd, ArrayList<Integer> sqltype, ArrayList<Object> sqldata) org.w3c.dom.Element(ResultSet) Funciona exactamente igual que el método executeSQL anterior salvo que los parámetros sqltype y sqldata son ArrayList en vez de Vector.
executeSQL(String database, String sqlcmd, ArrayList<Integer> sqltype, ArrayList<Object> sqldata, boolean gzip) org.w3c.dom.Element(ResultSet) Funciona exactamente igual que el método executeSQL anterior salvo que los parámetros sqltype y sqldata son ArrayList en vez de Vector.
executeSQL(String database, String sqlcmd, Integer[] sqltype, Object[] sqldata) org.w3c.dom.Element(ResultSet) Funciona exactamente igual que el método executeSQL anterior salvo que los parámetros sqltype y sqldata son del tipo Array en vez de Arraylist.
executeSQL(String database, String sqlcmd, Integer[] sqltype, Object[] sqldata, boolean gzip) org.w3c.dom.Element(ResultSet) Funciona exactamente igual que el método executeSQL anterior salvo que los parámetros sqltype y sqldata son del tipo Array en vez de Arraylist.
executeSQL(String database, String sqlcmd, int[] sqltype, Object[] sqldata, boolean gzip) org.w3c.dom.Element(ResultSet) Funciona exactamente igual que el método executeSQL anterior salvo que los parámetros sqltype es Array<int> en vez de Array<Integer>.
Única sentencia y múltiples filas
Función Return Descripción
executeSQLN(String database, String sqlcmd, Vector<Integer> sqltype, Vector<Object[]> sqldata) org.w3c.dom.Element(ResultSet) Ejecuta una operación SQL unitaria a la que se pueden pasar valores para los marcadores ? de la sentencia SQL. El parámetro sqltype índica los tipos de datos (java.sql.Types) y sqldata es un vector donde cada uno de sus elementos es un array de valores para ejecutar la sentencia sql, esto nos permite ejecutar la misma sentencia sql pero con distintos valores. Retorna un XML con el resultado de la ejecución.
executeSQLN(String database, String sqlcmd, ArrayList<Integer> sqltype, ArrayList<Object[]> sqldata) org.w3c.dom.Element(ResultSet) Funciona exactamente igual que el método executeSQLN anterior salvo que los parámetros sqltype y sqldata son ArrayList en vez de Vector.
executeSQLN(String database, String sqlcmd, Integer[] sqltype, ArrayList<Object[]> sqldata) org.w3c.dom.Element(ResultSet) Funciona exactamente igual que el método executeSQLN anterior salvo que el parámetro sqltype es de tipo Array en vez de Arraylist.
executeSQLN(String database, String sqlcmd, int[] sqltype, ArrayList<Object[]> sqldata) org.w3c.dom.Element(ResultSet) Funciona exactamente igual que el método executeSQLN anterior salvo que los parámetros sqltype es Array<int> en vez de Array<Integer>.
Múltiples sentencias y múltiples filas
Función Return Descripción
executeSQLN(String database, ArrayList<String> sqlcmd, ArrayList<int[]> sqltypes, ArrayList<ArrayList<Object[]>> sqldatas) org.w3c.dom.Element(ResultSet) Permite ejecutar varias sentencias sql de distinta naturaleza, en sqlcmd se indican las sentencias a ejecutar, en sqltypes se indica los tipos de datos de los marcadores ? de cada una de las sentencias y en sqldatas se indican el conjunto de valores para cada una de las sentencias. Retorna un xml con el resultado de la ejecución.
Catalogo
Función Return Descripción
getTables(String database) org.w3c.dom.Element(ResultSet) Retorna un XML con las tablas definidas en la base de datos que se le pasa como parámetro.
getColumns(String database, String tabname) org.w3c.dom.Element(ResultSet) Retorna un XML con los datos de columnas de la tabla y base de datos que se le pasan como parámetros.
getDatabaseFunctions(String database) Hashtable<String, String[]> Retorna un objeto hash cuyo campos calves son funciones propias del motor de base de datos y como valores la definición de las mismas.

[editar] 1.3 SOAPOBJServer

La siguiente tabla muestra las funciones implementdas por el servicio SOAPOBJServer:

Función Return Descripción
query(String database, String objcode) org.w3c.dom.Element(ResultSet) Retorna un XML con la definición de los campos y variables inputs del objeto que se le pasa como parámetro en el argumento objcode.
getBinary(String database, String tabname, String colname, String cond, boolean gzip) org.w3c.dom.Element(ResultSet) Permite obtener el contenido de un campo binario según los argumentos base datos , tabla , columna y condición que se le pasan como parámetros.
getInclude(String database, String include_code, String filter_code, String filter_cond) org.w3c.dom.Element(ResultSet) Retorna un XML con los datos que componen un LIST BOX definido en alguna de las wics (wic_jdic_include) asociadas a la base de datos que se la pasa como parámetro. En caso de que el include tenga una condición dínamica en los parámetros filter_code y filter_cond se pasan el objeto de referencia y la condición a aplicar.
execute(String database, String objcode, String qrycond, String type) org.w3c.dom.Element(ResultSet) Retorna un XML con el resultado de ejecución del objeto que se le pasa en el parámetro objcode. El objeto debe estar catalogado en alguna wic asociada a la base de datos de explotación que se indica en el prámetro database, y que el usuario tenga los privilegios necesarios para ejecutar el objeto en dicha base de datos. También se puede indicar con el argumento qrycond el filtro (campos de entrada) con el cual se ejecutara el objeto. El formato del resultado obtenido depende del parámetro type:
  • pdf
  • pdf-xml
  • fo-xml
  • fo-pdf
  • asc
  • xml
  • xml-softref
  • csv
  • xls
  • xls-ungroup
  • xlsx
  • xlsx-ungroup
execute(String database, String objcode, String qrycond, String type, boolean gzip) org.w3c.dom.Element(ResultSet) Funciona exactamente igual que la función anterior solo que esta permite la posibilidad de obtener el resultado de la ejecución del objeto en formato comprimido mediante el parámetro gzip.
execute(String database, String objcode, String qrycond, Hashtable<String, Object> cols, Hashtable<String, Object> vars, String type) org.w3c.dom.Element(ResultSet) Funciona exactamente igual que la función anterior solo que en este caso se omite el parámetro gzip y se añaden dos parámetros nuevos cols y vars de tipo hashtable (clave,valor), que para el caso de cols indicán el nombre de la columna y el valor, mientras que para vars indicán el nombre de la variable y el valor.
execute(String database, String objcode, String qrycond, Hashtable<String, Object> cols, Hashtable<String, Object> vars, String type, boolean gzip) org.w3c.dom.Element(ResultSet) Funciona exactamente igual que la función anterior solo que esta permite la posibilidad de obtener el resultado de la ejecución del objeto en formato comprimido mediante el parámetro gzip.
executeExist(String database, String tabname, String colname, String coldata, String qrycond, boolean allowmr, boolean docache) Hashtable<String, String> Permite comprobar la existencia del valor que se le pasa en el argumento coldata sobre la columna y la tabla que se la pasan en los argumentos colname y tabname respectivamente. Retorna parejas de clave valor (Hashtable) con el nombre de cada columna y su valor.
executeProcess(String database, String objcode, String cmd, String[] arg_data, int[] arg_type, Hashtable<String, String[]> parameters) void Permite ejecutar un proceso xsql-script o sentencia sql sobre el objeto que se le pasa en el argumento objcode. El objetivo de esta función es simular la acciones asociados a los botones definidos en el formulario del objeto.

[editar] 1.4 SOAPXMLServer

La siguiente tabla muestra las funciones implementdas por el servicio SOAPXMLServer:

Función Return Descripción
executeXML(String database, DataHandler xml_code) org.w3c.dom.Element(ResultSet) Permite ejecutar tanto procesos XSQL-SCRIPT, como transacciones en XML-SOAP, el parámetro xml_code es el fichero donde se almacena el código a ejecutar. Retorna un XML con el resultado de ejecución.
executeXML(String database, DataHandler xml_code, Vector<Object> arg_data) org.w3c.dom.Element(ResultSet) Funciona exactamente igual que la anterior función salvo que en esta existe la posibilidad de pasar en el vector arg_data las variables necesarias para ejecutar el código definido en el fichero xml_code.
executeXML(String database, DataHandler xml_code, ArrayList<Object> arg_data) org.w3c.dom.Element(ResultSet) Funciona exactamente igual que la anterior función salvo que en vez de pasar los argumentos en un objeto de tipo vector en tipo ArrayList.
executeXML(String database, String xml_code) org.w3c.dom.Element(ResultSet) Permite ejecutar tanto procesos XSQL-SCRIPT, como transacciones en XML-SOAP, el parámetro xml_code es un string que representa el código a ejecutar. Retorna un XML con el resultado de ejecución.
executeXML(String database, String xml_code, Vector<Object> arg_data) org.w3c.dom.Element(ResultSet) Funciona exactamente igual que la anterior función salvo que en esta existe la posibilidad de pasar en el vector arg_data las variables necesarias para ejecutar el código definido en el fichero xml_code.
executeXML(String database, String xml_code, ArrayList<Object> arg_data) org.w3c.dom.Element(ResultSet) Funciona exactamente igual que la anterior función salvo que en vez de pasar los argumentos en un objeto de tipo vector en tipo ArrayList.

[editar] 2 Configuración

WebStudio integra el servlet RPCRouterServlet de Apache. Puede verificar que el servlet está activo realizando una solicitud a su servidor webstudio desde su navegador con la siguiente url: http://miservidorwebstudio/soap/servlet/rpcrouter si todo es correcto, recibirá la respuesta del servlet indicándole que solo dialoga mediante POST.

SOAP RPC Router
Sorry, I don't speak via HTTP GET- you have to use HTTP POST to talk to me.

Con el servlet activo, el sistema atenderá los servicios SOAPSQLServer, SOAPXMLServer, SOAPOBJServer y SOAPAPPServer que se despliegan de forma automática tras la recepción de la primera solicitud.

[editar] 2.1 Seguridad

Los servicios del núcleo de WebStudio requieren autentificación, siendo preciso que el usuario esté registrado en el sistema. Los privilegios de acceso a bases de datos y las restricciones sobre operaciones SQL son así implícitas. El usuario y password de un cliente SOAP debe pués estar definido en la tabla de configuración wic_user del servidor.

Adicionalmente, el grupo de conexión a bases de datos del usuario definido en la tabla wic_dbms_users, debe tener activado el indicador de aceptación de solicitudes SOAP. Y para cada una de la bases de datos a la cual el usuario tiene acceso, tabla wic_dbms_usersdb, hay que indicar que tipo de servicio puede usar SOAPSQLServer, SOAPXMLServer, SOAPOBJServer y SOAPAPPServer.

[editar] 2.2 SSL y certificados digitales

El uso del transporte HTTP no garantiza la seguridad de los mensajes ante ataques de analizadores de red. En caso de que se desee la protección de los mensajes (y de forma implícita de la autentificación Basic), debe usarse un transporte seguro y por tanto HTTPS. Para ello requerirá certificados tanto en el servidor como en el cliente y deben ser verificados y creídos para que el mecanismo funcione. Asegúrese de activar SSL en WebStudio, puede activar el transporte SSL en el puerto 8443.

[editar] 3 Ejemplos respuestas soap

[editar] 3.1 SOAPAPPServer

[editar] 3.1.1 Obtener la lista de base de datos a las cuales tiene acceso el usuario

  • SOAP Request:
Content-Type: text/xml; charset=utf-8
Content-Transfer-Encoding: 8bit
text/xml: text/xml;charset=utf-8
Content-ID: <22772102.1383662669125.apache-soap.deister_mac6>
Content-Length: 520
 
<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<ns1:getDatabases xmlns:ns1="urn:SOAPAPPServer" SOAP-ENV:encodingStyle="http://xml.apache.org/xml-soap/literalxml">
<server xsi:type="xsd:string" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">dbsrv1</server>
</ns1:getDatabases>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
  • SOAP Response:
<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<ns1:getDatabasesResponse xmlns:ns1="urn:SOAPAPPServer" SOAP-ENV:encodingStyle="http://xml.apache.org/xml-soap/literalxml">
<return>
<sqlresponse country="ES" date="2013-11-05T14:43:46.801Z" date-format="dd-MM-yyyy" dbms="" from="XMLSQLResultSetSerializer" host="web1" lang="es" number-format="#.##0,###" rows="2" time-format="HH:mm:ss" timestamp-format="dd-MM-yyyy HH:mm:ss" type="rawsql">
 <sqlinfo>
  <stdout><![CDATA[]]></stdout>
  <stderr><![CDATA[]]></stderr>
  <sqlstmt><![CDATA[]]></sqlstmt>
  <sqlsort/>
  <sqluser/>
  <sqldbms/>
  <sqlengine/>
  <sqllang>es-</sqllang>
  <sqltype/>
  <sqltime>0</sqltime>
  <sqlcount>0</sqlcount>
  <sqlserial>0</sqlserial>
  <sqlmaxrows>-1</sqlmaxrows>
 </sqlinfo>
 <metadata>
  <column catalogName="" columnClassName="java.lang.String" columnDisplaySize="10" columnLabel="" columnName="code" columnType="1" columnTypeName="char" isAutoIncrement="false" isCaseSensitive="false" isCurrency="false" isDefinitelyWritable="false" isHidden="false" isNullable="0" isNumeric="false" isPercent="false" isReadOnly="false" isRowid="false" isSigned="false" isTotal="false" isWritable="false" precision="0" scale="0" schemaName="" tableName=""/>
  <column catalogName="" columnClassName="java.lang.String" columnDisplaySize="10" columnLabel="" columnName="name" columnType="1" columnTypeName="char" isAutoIncrement="false" isCaseSensitive="false" isCurrency="false" isDefinitelyWritable="false" isHidden="false" isNullable="0" isNumeric="false" isPercent="false" isReadOnly="false" isRowid="false" isSigned="false" isTotal="false" isWritable="false" precision="0" scale="0" schemaName="" tableName=""/>
  <column catalogName="" columnClassName="java.lang.String" columnDisplaySize="10" columnLabel="" columnName="info" columnType="1" columnTypeName="char" isAutoIncrement="false" isCaseSensitive="false" isCurrency="false" isDefinitelyWritable="false" isHidden="false" isNullable="0" isNumeric="false" isPercent="false" isReadOnly="false" isRowid="false" isSigned="false" isTotal="false" isWritable="false" precision="0" scale="0" schemaName="" tableName=""/>
  <column catalogName="" columnClassName="java.lang.String" columnDisplaySize="10" columnLabel="" columnName="homeurl" columnType="1" columnTypeName="char" isAutoIncrement="false" isCaseSensitive="false" isCurrency="false" isDefinitelyWritable="false" isHidden="false" isNullable="0" isNumeric="false" isPercent="false" isReadOnly="false" isRowid="false" isSigned="false" isTotal="false" isWritable="false" precision="0" scale="0" schemaName="" tableName=""/>
  <column catalogName="" columnClassName="java.lang.String" columnDisplaySize="10" columnLabel="" columnName="server" columnType="1" columnTypeName="char" isAutoIncrement="false" isCaseSensitive="false" isCurrency="false" isDefinitelyWritable="false" isHidden="false" isNullable="0" isNumeric="false" isPercent="false" isReadOnly="false" isRowid="false" isSigned="false" isTotal="false" isWritable="false" precision="0" scale="0" schemaName="" tableName=""/>
  <column catalogName="" columnClassName="java.lang.String" columnDisplaySize="10" columnLabel="" columnName="engine" columnType="1" columnTypeName="char" isAutoIncrement="false" isCaseSensitive="false" isCurrency="false" isDefinitelyWritable="false" isHidden="false" isNullable="0" isNumeric="false" isPercent="false" isReadOnly="false" isRowid="false" isSigned="false" isTotal="false" isWritable="false" precision="0" scale="0" schemaName="" tableName=""/>
  <column catalogName="" columnClassName="java.lang.String" columnDisplaySize="10" columnLabel="" columnName="dbms_dicts" columnType="1" columnTypeName="char" isAutoIncrement="false" isCaseSensitive="false" isCurrency="false" isDefinitelyWritable="false" isHidden="false" isNullable="0" isNumeric="false" isPercent="false" isReadOnly="false" isRowid="false" isSigned="false" isTotal="false" isWritable="false" precision="0" scale="0" schemaName="" tableName=""/>
  <column catalogName="" columnClassName="java.lang.String" columnDisplaySize="10" columnLabel="" columnName="user_dicts" columnType="1" columnTypeName="char" isAutoIncrement="false" isCaseSensitive="false" isCurrency="false" isDefinitelyWritable="false" isHidden="false" isNullable="0" isNumeric="false" isPercent="false" isReadOnly="false" isRowid="false" isSigned="false" isTotal="false" isWritable="false" precision="0" scale="0" schemaName="" tableName=""/>
  <column catalogName="" columnClassName="java.lang.String" columnDisplaySize="10" columnLabel="" columnName="iwa_name" columnType="1" columnTypeName="char" isAutoIncrement="false" isCaseSensitive="false" isCurrency="false" isDefinitelyWritable="false" isHidden="false" isNullable="0" isNumeric="false" isPercent="false" isReadOnly="false" isRowid="false" isSigned="false" isTotal="false" isWritable="false" precision="0" scale="0" schemaName="" tableName=""/>
  <column catalogName="" columnClassName="java.lang.String" columnDisplaySize="10" columnLabel="" columnName="olap_schema_codes" columnType="1" columnTypeName="char" isAutoIncrement="false" isCaseSensitive="false" isCurrency="false" isDefinitelyWritable="false" isHidden="false" isNullable="0" isNumeric="false" isPercent="false" isReadOnly="false" isRowid="false" isSigned="false" isTotal="false" isWritable="false" precision="0" scale="0" schemaName="" tableName=""/>
  <column catalogName="" columnClassName="java.lang.String" columnDisplaySize="10" columnLabel="" columnName="olap_schema_names" columnType="1" columnTypeName="char" isAutoIncrement="false" isCaseSensitive="false" isCurrency="false" isDefinitelyWritable="false" isHidden="false" isNullable="0" isNumeric="false" isPercent="false" isReadOnly="false" isRowid="false" isSigned="false" isTotal="false" isWritable="false" precision="0" scale="0" schemaName="" tableName=""/>
  <column catalogName="" columnClassName="java.lang.Boolean" columnDisplaySize="6" columnLabel="" columnName="is_wic" columnType="16" columnTypeName="boolean" isAutoIncrement="false" isCaseSensitive="false" isCurrency="false" isDefinitelyWritable="false" isHidden="false" isNullable="0" isNumeric="false" isPercent="false" isReadOnly="false" isRowid="false" isSigned="false" isTotal="false" isWritable="false" precision="0" scale="0" schemaName="" tableName=""/>
  <column catalogName="" columnClassName="java.lang.Boolean" columnDisplaySize="6" columnLabel="" columnName="is_mirror" columnType="16" columnTypeName="boolean" isAutoIncrement="false" isCaseSensitive="false" isCurrency="false" isDefinitelyWritable="false" isHidden="false" isNullable="0" isNumeric="false" isPercent="false" isReadOnly="false" isRowid="false" isSigned="false" isTotal="false" isWritable="false" precision="0" scale="0" schemaName="" tableName=""/>
  <column catalogName="" columnClassName="java.lang.Boolean" columnDisplaySize="6" columnLabel="" columnName="auth_select" columnType="16" columnTypeName="boolean" isAutoIncrement="false" isCaseSensitive="false" isCurrency="false" isDefinitelyWritable="false" isHidden="false" isNullable="0" isNumeric="false" isPercent="false" isReadOnly="false" isRowid="false" isSigned="false" isTotal="false" isWritable="false" precision="0" scale="0" schemaName="" tableName=""/>
  <column catalogName="" columnClassName="java.lang.Boolean" columnDisplaySize="6" columnLabel="" columnName="auth_insert" columnType="16" columnTypeName="boolean" isAutoIncrement="false" isCaseSensitive="false" isCurrency="false" isDefinitelyWritable="false" isHidden="false" isNullable="0" isNumeric="false" isPercent="false" isReadOnly="false" isRowid="false" isSigned="false" isTotal="false" isWritable="false" precision="0" scale="0" schemaName="" tableName=""/>
  <column catalogName="" columnClassName="java.lang.Boolean" columnDisplaySize="6" columnLabel="" columnName="auth_delete" columnType="16" columnTypeName="boolean" isAutoIncrement="false" isCaseSensitive="false" isCurrency="false" isDefinitelyWritable="false" isHidden="false" isNullable="0" isNumeric="false" isPercent="false" isReadOnly="false" isRowid="false" isSigned="false" isTotal="false" isWritable="false" precision="0" scale="0" schemaName="" tableName=""/>
  <column catalogName="" columnClassName="java.lang.Boolean" columnDisplaySize="6" columnLabel="" columnName="auth_update" columnType="16" columnTypeName="boolean" isAutoIncrement="false" isCaseSensitive="false" isCurrency="false" isDefinitelyWritable="false" isHidden="false" isNullable="0" isNumeric="false" isPercent="false" isReadOnly="false" isRowid="false" isSigned="false" isTotal="false" isWritable="false" precision="0" scale="0" schemaName="" tableName=""/>
  <column catalogName="" columnClassName="java.lang.Boolean" columnDisplaySize="6" columnLabel="" columnName="auth_soap_obj" columnType="16" columnTypeName="boolean" isAutoIncrement="false" isCaseSensitive="false" isCurrency="false" isDefinitelyWritable="false" isHidden="false" isNullable="0" isNumeric="false" isPercent="false" isReadOnly="false" isRowid="false" isSigned="false" isTotal="false" isWritable="false" precision="0" scale="0" schemaName="" tableName=""/>
  <column catalogName="" columnClassName="java.lang.Boolean" columnDisplaySize="6" columnLabel="" columnName="auth_soap_sql" columnType="16" columnTypeName="boolean" isAutoIncrement="false" isCaseSensitive="false" isCurrency="false" isDefinitelyWritable="false" isHidden="false" isNullable="0" isNumeric="false" isPercent="false" isReadOnly="false" isRowid="false" isSigned="false" isTotal="false" isWritable="false" precision="0" scale="0" schemaName="" tableName=""/>
  <column catalogName="" columnClassName="java.lang.Boolean" columnDisplaySize="6" columnLabel="" columnName="auth_soap_xml" columnType="16" columnTypeName="boolean" isAutoIncrement="false" isCaseSensitive="false" isCurrency="false" isDefinitelyWritable="false" isHidden="false" isNullable="0" isNumeric="false" isPercent="false" isReadOnly="false" isRowid="false" isSigned="false" isTotal="false" isWritable="false" precision="0" scale="0" schemaName="" tableName=""/>
  <column catalogName="" columnClassName="java.lang.String" columnDisplaySize="10" columnLabel="" columnName="logo_url" columnType="1" columnTypeName="char" isAutoIncrement="false" isCaseSensitive="false" isCurrency="false" isDefinitelyWritable="false" isHidden="false" isNullable="0" isNumeric="false" isPercent="false" isReadOnly="false" isRowid="false" isSigned="false" isTotal="false" isWritable="false" precision="0" scale="0" schemaName="" tableName=""/>
  <column catalogName="" columnClassName="java.lang.Byte[]" columnDisplaySize="-1" columnLabel="" columnName="logo_img" columnType="-2" columnTypeName="binary" isAutoIncrement="false" isCaseSensitive="false" isCurrency="false" isDefinitelyWritable="false" isHidden="false" isNullable="0" isNumeric="false" isPercent="false" isReadOnly="false" isRowid="false" isSigned="false" isTotal="false" isWritable="false" precision="0" scale="0" schemaName="" tableName=""/>
 </metadata>
 <rowset encoding="UTF-8" lang="es-">
  <r>
   <c>demo_sports</c>
   <c>Demo Sports</c>
   <c>Demostración empresa detallista de productos deportivos.</c>
   <c>/servlet/jmnu_tab?code=ERP</c>
   <c>dbsrv1</c>
   <c>ids</c>
   <c>[wic_icrm, wic_iret, wic_ipos, wic_apps, wic_iman, wic_itra, wic_iedi, wic_iges, wic_icon]</c>
   <c>[wic_icon]</c>
   <c n="t"/>
   <c>[Point Of Sale, REVA_Demanda, APPS_SFA, Saldos, Consums]</c>
   <c>[Point Of Sale OLAP, REVA_Demanda, APPS_SFA, Saldos Test 1, Consums Test]</c>
   <c>false</c>
   <c>false</c>
   <c>true</c>
   <c>false</c>
   <c>false</c>
   <c>false</c>
   <c>true</c>
   <c>true</c>
   <c>true</c>
   <c/>
   <c>R0lGODlhIAAgAIcAAAAAADk5OXtKAHNzc/8AAPIyW5yMe86cAP/OAP//AP/OY6WlpdbW1v//9////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAMAAAUALAAAAAAgACAAAAj/AAsIHEiwYAEBCBMiNMiwocIDCCEKgNiw4sGHECVKtGhQ4UQEB0IimJiQI8GEIQ8kQMByJEiIAwIEiGkx4gEECVbmTCDgpYABDBg0CDrA4USVOHfybHlgQAMCDqISYBCgY0+VSnkKWAkyAIOoYKMyKDowYtKcWwUo2DryQIAGDRxAheqAatmjWXkqALAy5M+vYaM2qCoQIcudWwOszRkAQGOgUuWKJWs2q9oACBovAMD5bdzAdi9i5am3cYAFqBt3ZkBX7tjCH5Uq1ow6KFUAQN/aHlw2JFq9AgDUti0UANyxM2cCGBig507FPU8vCAr28fEB2GkWMBAbOALh0z87wFDtWGzQBQaWc+/J0nACmUE/k+fsdOj0xts/uswJfibc+ZyVF5R0AHDXXkvvTScUgAEGOBMDqBVoVkrfDedAgxhyZluEBmj0Uma1/ZdhgE6dt9l6PoUUgAEKwjUiZ0NByCFJGSF0mm0ONDDAiEBtuNlFHglQAAC7DQVgAHWZuJxF0uHYAIYxmkiYRcJBOGCOx+k2HWcmFQBgfMcxgOGUHM1H3HkNktVlATtyVhtqW3a2ZkGayVibY3M2ZJpjeDIUEAA7</c>
  </r>
  <r>
   <c>wic_icon</c>
   <c>iCON Metadata</c>
   <c>Dicccionario central de control de ERP/iCON</c>
   <c>/servlet/jmnu_tab?code=WIC</c>
   <c>dbsrv1</c>
   <c>ids</c>
   <c>[wic]</c>
   <c>[]</c>
   <c n="t"/>
   <c>[]</c>
   <c>[]</c>
   <c>true</c>
   <c>false</c>
   <c>true</c>
   <c>false</c>
   <c>false</c>
   <c>false</c>
   <c>true</c>
   <c>true</c>
   <c>true</c>
   <c/>
   <c>R0lGODlhIAAgALMAAAAAADMAmTMzMzNm/zOZmWZmZmZm/5lmmZlm/5nMzMxm///MzP/M////zP//////wCH5BAEAAA8ALAAAAAAgACAAAAT38MlJq704S6B7Bg7njZuTJCKpgeeZqhbbuvAD3Hiu7x3o/MCgEPi6gBbIpHKJPBRjjsVuels4e9GbABfo4rYA67NyBIADg/TACxavylu0Wh0wh51jWygrkDMYc2tVTgRPLGUAan+BA4MABCgUMmVyjHR3jzQPByYuWWgGA6GjooJikJoALZQGra6togZ1p5obnlIABgi6ugO7u46QhihZAAEIyMnJdZiFGDdZBcYICtTWddJieSVSBXHUCtXYW24r0QXSxl7o6JhYuFQ65R9RTPZJVysH+/z9/v3bNsQbGNAIgYMIndWIMSPSQiOrHn5wKBHDARgRAAA7</c>
  </r>
 </rowset>
</sqlresponse>
</return>
</ns1:getDatabasesResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

[editar] 3.2 SOAPSQLServer

[editar] 3.2.1 Realizar una consulta sobre la base de datos

  • SOAP Request:
Content-Type: text/xml; charset=utf-8
Content-Transfer-Encoding: 8bit
text/xml: text/xml;charset=utf-8
Content-ID: <16993205.1383654576765.apache-soap.deister_mac6>
Content-Length: 520
 
<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<ns1:executeSQL xmlns:ns1="urn:SOAPSQLServer" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<database xsi:type="xsd:string">demo_sports</database>
<sqlcmd xsi:type="xsd:string">select * from cdiarios</sqlcmd>
</ns1:executeSQL>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
  • SOAP Response:
<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<ns1:executeSQLResponse xmlns:ns1="urn:SOAPSQLServer" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<sqlresponse SOAP-ENV:encodingStyle="http://xml.apache.org/xml-soap/literalxml">
<sqlresponse country="ES" date="2013-11-05T12:29:11.781Z" date-format="dd-MM-yyyy" dbms="demo_sports" from="XMLSQLResultSetSerializer" host="web1" lang="es" number-format="#.##0,###" rows="8" time-format="HH:mm:ss" timestamp-format="dd-MM-yyyy HH:mm:ss" type="rawsql">
 <sqlinfo>
  <stdout><![CDATA[]]></stdout>
  <stderr><![CDATA[]]></stderr>
  <sqlstmt><![CDATA[select * from cdiarios]]></sqlstmt>
  <sqlsort/>
  <sqluser>informix</sqluser>
  <sqldbms>demo_sports</sqldbms>
  <sqlengine>ids</sqlengine>
  <sqllang>es-</sqllang>
  <sqltype>SELECT</sqltype>
  <sqltime>0</sqltime>
  <sqlcount>0</sqlcount>
  <sqlserial>0</sqlserial>
  <sqlmaxrows>200000</sqlmaxrows>
  <sqltables>
   <sqltable bestrowid="codigo" delete="true" insert="true" table="cdiarios" update="true">cdiarios</sqltable>
  </sqltables>
 </sqlinfo>
 <metadata>
  <column attr-always="0" attr-default="" attr-format="UPSHIFT" attr-icon="" catalogName=" " columnClassName="java.lang.String" columnDisplaySize="2" columnLabel="Diario" columnName="codigo" columnType="1" columnTypeName="char" isAutoIncrement="false" isCaseSensitive="false" isCurrency="false" isDefinitelyWritable="true" isHidden="false" isNullable="0" isNumeric="false" isPercent="false" isReadOnly="false" isRowid="false" isSigned="false" isTotal="false" isWritable="true" precision="0" scale="0" schemaName=" " tableName="cdiarios"/>
  <column catalogName=" " columnClassName="java.lang.String" columnDisplaySize="40" columnLabel="Descripción" columnName="nomdia" columnType="1" columnTypeName="char" isAutoIncrement="false" isCaseSensitive="false" isCurrency="false" isDefinitelyWritable="true" isHidden="false" isNullable="1" isNumeric="false" isPercent="false" isReadOnly="false" isRowid="false" isSigned="false" isTotal="false" isWritable="true" precision="0" scale="0" schemaName=" " tableName="cdiarios"/>
 </metadata>
 <rowset encoding="UTF-8" lang="es-">
  <r>
   <c>DC</c>
   <c>DIARIO DE CAJA</c>
  </r>
  <r>
   <c>AA</c>
   <c>DIARIO DE LIQUIDACIÓN</c>
  </r>
  <r>
   <c>DG</c>
   <c>DIARIO GENERAL</c>
  </r>
  <r>
   <c>CA</c>
   <c>CAJA</c>
  </r>
  <r>
   <c>AM</c>
   <c>ADMINISTRACIÓN</c>
  </r>
  <r>
   <c>DR</c>
   <c>DIARI DE REPARTIMENTS</c>
  </r>
  <r>
   <c>DV</c>
   <c>Diario de ventas</c>
  </r>
  <r>
   <c>SF</c>
   <c>Diario SF</c>
  </r>
 </rowset>
</sqlresponse>
</sqlresponse>
</ns1:executeSQLResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

[editar] 3.2.2 Insertar un registro sobre una tabla de base de datos

  • SOAP Request:
Content-Type: text/xml; charset=utf-8
Content-Transfer-Encoding: 8bit
text/xml: text/xml;charset=utf-8
Content-ID: <23025815.1383665259343.apache-soap.deister_mac6>
Content-Length: 559
 
<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<ns1:executeSQL xmlns:ns1="urn:SOAPSQLServer" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<database xsi:type="xsd:string">demo_sports</database>
<sqlcmd xsi:type="xsd:string">insert into cdiarios values (&apos;N&apos;,&apos;NUEVO&apos;)</sqlcmd>
</ns1:executeSQL>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
  • SOAP Response:
<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<ns1:executeSQLResponse xmlns:ns1="urn:SOAPSQLServer" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<sqlresponse SOAP-ENV:encodingStyle="http://xml.apache.org/xml-soap/literalxml">
<sqlresponse country="ES" date="2013-11-05T15:26:45.491Z" date-format="dd-MM-yyyy" dbms="demo_sports" from="XMLSQLResultSetSerializer" host="web1" lang="es" number-format="#.##0,###" rows="0" time-format="HH:mm:ss" timestamp-format="dd-MM-yyyy HH:mm:ss" type="rawsql">
 <sqlinfo>
  <stdout><![CDATA[]]></stdout>
  <stderr><![CDATA[]]></stderr>
  <sqlstmt><![CDATA[insert into cdiarios values (&apos;N&apos;,&apos;NUEVO&apos;)]]></sqlstmt>
  <sqlsort/>
  <sqluser>informix</sqluser>
  <sqldbms>demo_sports</sqldbms>
  <sqlengine/>
  <sqllang>es-</sqllang>
  <sqltype>INSERT</sqltype>
  <sqltime>7</sqltime>
  <sqlcount>1</sqlcount>
  <sqlserial>0</sqlserial>
  <sqlmaxrows>200000</sqlmaxrows>
  <sqltables>
  </sqltables>
 </sqlinfo>
</sqlresponse>
</sqlresponse>
</ns1:executeSQLResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

[editar] 3.2.3 Insertar un registro sobre una tabla de base de datos con error de clave duplicada

  • SOAP Request:
SOAP Request:
Content-Type: text/xml; charset=utf-8
Content-Transfer-Encoding: 8bit
text/xml: text/xml;charset=utf-8
Content-ID: <23025815.1383665469203.apache-soap.deister_mac6>
Content-Length: 559
 
<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<ns1:executeSQL xmlns:ns1="urn:SOAPSQLServer" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<database xsi:type="xsd:string">demo_sports</database>
<sqlcmd xsi:type="xsd:string">insert into cdiarios values (&apos;N&apos;,&apos;NUEVO&apos;)</sqlcmd>
</ns1:executeSQL>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
  • SOAP Response:
<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<ns1:executeSQLResponse xmlns:ns1="urn:SOAPSQLServer" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<error SOAP-ENV:encodingStyle="http://xml.apache.org/xml-soap/literalxml">
<error date="2013-11-05T16:30:14.552Z" dbms="demo_sports" host="web1">
 <sqlstmt>
<![CDATA[insert into cdiarios values ('N','NUEVO')]]>
</sqlstmt>
  <exception>
   <errmessg class="java.sql.SQLException" sqlcode="-268" sqlstate="23000">
<![CDATA[java.sql.SQLException: Unique constraint (informix.p_cdiarios) violated.]]>
</errmessg>
  <errtrace>
<![CDATA[    > FROM [0] java.sql.SQLException
java.sql.SQLException: Unique constraint (informix.p_cdiarios) violated.
	at com.informix.jdbc.IfxSqli.a(IfxSqli.java:3609)
	at com.informix.jdbc.IfxSqli.E(IfxSqli.java:3934)
	at com.informix.jdbc.IfxSqli.dispatchMsg(IfxSqli.java:2682)
	at com.informix.jdbc.IfxSqli.receiveMessage(IfxSqli.java:2598)
	at com.informix.jdbc.IfxSqli.c(IfxSqli.java:1518)
	at com.informix.jdbc.IfxSqli.executeExecute(IfxSqli.java:2513)
	at com.informix.jdbc.IfxSqli.executeExecute(IfxSqli.java:2450)
	at com.informix.jdbc.IfxResultSet.b(IfxResultSet.java:393)
	at com.informix.jdbc.IfxStatement.a(IfxStatement.java:1326)
	at com.informix.jdbc.IfxPreparedStatement.d(IfxPreparedStatement.java:449)
	at com.informix.jdbc.IfxPreparedStatement.execute(IfxPreparedStatement.java:434)
	at deister.webstudio.core.dbms.jdbc.DBPoolPreparedStatement.execute(DBPoolPreparedStatement.java:333)
	at deister.webstudio.core.dbms.jdbc.DBPoolConnection.execute(DBPoolConnection.java:2634)
	at deister.webstudio.core.dbms.jdbc.DBPoolConnection.execute(DBPoolConnection.java:2624)
	at deister.webstudio.core.dbms.jdbc.DBPoolConnection.execute(DBPoolConnection.java:2614)
	at deister.webstudio.core.services.soap.SOAPSQLServer.executeSQL(SOAPSQLServer.java:418)
	at deister.webstudio.core.services.soap.SOAPSQLServer.executeSQL(SOAPSQLServer.java:344)
	at deister.webstudio.core.services.soap.SOAPSQLServer.executeSQL(SOAPSQLServer.java:303)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.soap.server.RPCRouter.invoke(RPCRouter.java:165)
	at deister.webstudio.core.services.soap.SimpleAuthenticationJavaProvider.invoke(SimpleAuthenticationJavaProvider.java:341)
	at org.apache.soap.server.http.RPCRouterServlet.doPost(RPCRouterServlet.java:334)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at deister.webstudio.core.server.filters.ExpiresFilter.doFilter(ExpiresFilter.java:1266)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at deister.webstudio.core.server.filters.CharsetRequestFilter.doFilter(CharsetRequestFilter.java:149)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:470)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:581)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:879)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
	at java.lang.Thread.run(Thread.java:662)
Caused by: java.sql.SQLException: ISAM error: duplicate value for a record with unique key.
	at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:413)
	at com.informix.jdbc.IfxSqli.E(IfxSqli.java:3939)
	... 47 more
 
	SQL ERROR: -268 Violación de restricción única (%s).
	SQL STATE: 23000
    > FROM [1] java.sql.SQLException
java.sql.SQLException: ISAM error: duplicate value for a record with unique key.
	at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:413)
	at com.informix.jdbc.IfxSqli.a(IfxSqli.java:3613)
	at com.informix.jdbc.IfxSqli.E(IfxSqli.java:3938)
	at com.informix.jdbc.IfxSqli.dispatchMsg(IfxSqli.java:2682)
	at com.informix.jdbc.IfxSqli.receiveMessage(IfxSqli.java:2598)
	at com.informix.jdbc.IfxSqli.c(IfxSqli.java:1518)
	at com.informix.jdbc.IfxSqli.executeExecute(IfxSqli.java:2513)
	at com.informix.jdbc.IfxSqli.executeExecute(IfxSqli.java:2450)
	at com.informix.jdbc.IfxResultSet.b(IfxResultSet.java:393)
	at com.informix.jdbc.IfxStatement.a(IfxStatement.java:1326)
	at com.informix.jdbc.IfxPreparedStatement.d(IfxPreparedStatement.java:449)
	at com.informix.jdbc.IfxPreparedStatement.execute(IfxPreparedStatement.java:434)
	at deister.webstudio.core.dbms.jdbc.DBPoolPreparedStatement.execute(DBPoolPreparedStatement.java:333)
	at deister.webstudio.core.dbms.jdbc.DBPoolConnection.execute(DBPoolConnection.java:2634)
	at deister.webstudio.core.dbms.jdbc.DBPoolConnection.execute(DBPoolConnection.java:2624)
	at deister.webstudio.core.dbms.jdbc.DBPoolConnection.execute(DBPoolConnection.java:2614)
	at deister.webstudio.core.services.soap.SOAPSQLServer.executeSQL(SOAPSQLServer.java:418)
	at deister.webstudio.core.services.soap.SOAPSQLServer.executeSQL(SOAPSQLServer.java:344)
	at deister.webstudio.core.services.soap.SOAPSQLServer.executeSQL(SOAPSQLServer.java:303)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.soap.server.RPCRouter.invoke(RPCRouter.java:165)
	at deister.webstudio.core.services.soap.SimpleAuthenticationJavaProvider.invoke(SimpleAuthenticationJavaProvider.java:341)
	at org.apache.soap.server.http.RPCRouterServlet.doPost(RPCRouterServlet.java:334)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at deister.webstudio.core.server.filters.ExpiresFilter.doFilter(ExpiresFilter.java:1266)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at deister.webstudio.core.server.filters.CharsetRequestFilter.doFilter(CharsetRequestFilter.java:149)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:470)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:581)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:879)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
	at java.lang.Thread.run(Thread.java:662)
 
	SQL ERROR: -100 Error ISAM: valor duplicado para un registro de clave única
	SQL STATE: IX000
    > FROM [2] deister.webstudio.core.dbms.jdbc.SQLExceptionInfo
SQLExceptionInfo: class=RW,server=dbsrv1,dbms=demo_sports,group=deister_mad {1}
insert into cdiarios values ('N','NUEVO')
    > FROM [3] deister.webstudio.core.dbms.jdbc.SQLExceptionInfo
SQLExceptionInfo: class=RW,server=dbsrv1,dbms=demo_sports,group=deister_mad {1}
 
]]>
</errtrace>
  </exception>
</error>
</error>
</ns1:executeSQLResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

[editar] 3.2.4 Acceder a una base de datos a la cual no se tiene permiso

  • SOAP Resquest:
Content-Type: text/xml; charset=utf-8
Content-Transfer-Encoding: 8bit
text/xml: text/xml;charset=utf-8
Content-ID: <23025815.1383663544718.apache-soap.deister_mac6>
Content-Length: 523
 
<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<ns1:executeSQL xmlns:ns1="urn:SOAPSQLServer" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<database xsi:type="xsd:string">demo_formacion</database>
<sqlcmd xsi:type="xsd:string">select * from cdiarios</sqlcmd>
</ns1:executeSQL>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
  • SOAP Response:
<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<ns1:executeSQLResponse xmlns:ns1="urn:SOAPSQLServer" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<error SOAP-ENV:encodingStyle="http://xml.apache.org/xml-soap/literalxml">
<error date="2013-11-05T15:58:20.049Z" dbms="demo_formacion" host="web1">
 <sqlstmt>
<![CDATA[select * from cdiarios]]>
</sqlstmt>
  <exception>
   <errmessg class="deister.webstudio.core.util.exception.SecurityViolationException" sqlcode="0" sqlstate="">
<![CDATA[deister.webstudio.core.util.exception.SecurityViolationException: Database-NotAllowedForUser: Database demo_formacion is not defined for connection group demo.]]>
</errmessg>
  <errtrace>
<![CDATA[    > FROM [0] deister.webstudio.core.util.exception.SecurityViolationException
deister.webstudio.core.util.exception.SecurityViolationException: Database-NotAllowedForUser: Database demo_formacion is not defined for connection group demo.
	at deister.webstudio.core.dbms.info.conf.wic_dbms_users.a(wic_dbms_users.java:1470)
	at deister.webstudio.core.dbms.info.conf.wic_dbms_users.canSelect(wic_dbms_users.java:1265)
	at deister.webstudio.core.dbms.pool.DBPoolManager.getSOAPUsrConnection(DBPoolManager.java:605)
	at deister.webstudio.core.services.soap.SOAPSQLServer.executeSQL(SOAPSQLServer.java:355)
	at deister.webstudio.core.services.soap.SOAPSQLServer.executeSQL(SOAPSQLServer.java:344)
	at deister.webstudio.core.services.soap.SOAPSQLServer.executeSQL(SOAPSQLServer.java:303)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.soap.server.RPCRouter.invoke(RPCRouter.java:165)
	at deister.webstudio.core.services.soap.SimpleAuthenticationJavaProvider.invoke(SimpleAuthenticationJavaProvider.java:341)
	at org.apache.soap.server.http.RPCRouterServlet.doPost(RPCRouterServlet.java:334)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at deister.webstudio.core.server.filters.ExpiresFilter.doFilter(ExpiresFilter.java:1266)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at deister.webstudio.core.server.filters.CharsetRequestFilter.doFilter(CharsetRequestFilter.java:149)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:470)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:581)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:879)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
	at java.lang.Thread.run(Thread.java:662)
]]>
</errtrace>
  </exception>
</error>
</error>
</ns1:executeSQLResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

[editar] 3.2.5 Usuario sin permiso de inserción sobre la base de datos

  • SOAP Resquest:
Content-Type: text/xml; charset=utf-8
Content-Transfer-Encoding: 8bit
text/xml: text/xml;charset=utf-8
Content-ID: <11625173.1383664846796.apache-soap.deister_mac6>
Content-Length: 559
 
<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<ns1:executeSQL xmlns:ns1="urn:SOAPSQLServer" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<database xsi:type="xsd:string">demo_sports</database>
<sqlcmd xsi:type="xsd:string">insert into cdiarios values (&apos;N&apos;,&apos;NUEVO&apos;)</sqlcmd>
</ns1:executeSQL>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
  • SOAP Response:
<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<ns1:executeSQLResponse xmlns:ns1="urn:SOAPSQLServer" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<error SOAP-ENV:encodingStyle="http://xml.apache.org/xml-soap/literalxml">
<error date="2013-11-05T16:19:55.598Z" dbms="demo_sports" host="web1">
 <sqlstmt>
<![CDATA[insert into cdiarios values ('N','NUEVO')]]>
</sqlstmt>
  <exception>
   <errmessg class="deister.webstudio.core.util.exception.SecurityViolationException" sqlcode="0" sqlstate="">
<![CDATA[deister.webstudio.core.util.exception.SecurityViolationException: HttpUser.checkSQLCommandIsAllowed.NO_ROLE: User demo has no role permission dbstudio.insert]]>
</errmessg>
  <errtrace>
<![CDATA[    > FROM [0] deister.webstudio.core.util.exception.SecurityViolationException
deister.webstudio.core.util.exception.SecurityViolationException: HttpUser.checkSQLCommandIsAllowed.NO_ROLE: User demo has no role permission dbstudio.insert
	at deister.webstudio.core.dbms.info.conf.HttpUser.checkSQLCommandIsAllowed(HttpUser.java:2623)
	at deister.webstudio.core.dbms.DBUtils.getSecureSQLCommands(DBUtils.java:574)
	at deister.webstudio.core.services.soap.SOAPSQLServer.executeSQL(SOAPSQLServer.java:391)
	at deister.webstudio.core.services.soap.SOAPSQLServer.executeSQL(SOAPSQLServer.java:344)
	at deister.webstudio.core.services.soap.SOAPSQLServer.executeSQL(SOAPSQLServer.java:303)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.soap.server.RPCRouter.invoke(RPCRouter.java:165)
	at deister.webstudio.core.services.soap.SimpleAuthenticationJavaProvider.invoke(SimpleAuthenticationJavaProvider.java:341)
	at org.apache.soap.server.http.RPCRouterServlet.doPost(RPCRouterServlet.java:334)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at deister.webstudio.core.server.filters.ExpiresFilter.doFilter(ExpiresFilter.java:1266)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at deister.webstudio.core.server.filters.CharsetRequestFilter.doFilter(CharsetRequestFilter.java:149)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:470)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:581)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:879)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
	at java.lang.Thread.run(Thread.java:662)
]]>
</errtrace>
  </exception>
</error>
</error>
</ns1:executeSQLResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

[editar] 3.3 SOAPOBJServer

[editar] 3.3.1 Ejecutar un objeto en modo ascii

  • SOAP Request:
Content-Type: text/xml; charset=utf-8
Content-Transfer-Encoding: 8bit
text/xml: text/xml;charset=utf-8
Content-ID: <23025815.1383669406125.apache-soap.deister_mac6>
Content-Length: 586
 
<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<ns1:execute xmlns:ns1="urn:SOAPOBJServer" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<database xsi:type="xsd:string">demo_sports</database>
<objcode xsi:type="xsd:string">cdiarios</objcode>
<qrycond xsi:type="xsd:string">1=1</qrycond>
<type xsi:type="xsd:string">asc</type>
</ns1:execute>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
  • SOAP Response:
<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<ns1:executeResponse xmlns:ns1="urn:SOAPOBJServer" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<objresponse SOAP-ENV:encodingStyle="http://xml.apache.org/xml-soap/literalxml">
<objresponse date="2013-11-05T17:35:42.326Z" host="web1">
 <object code="cdiarios" dbms="demo_sports" encoding="UTF-8" glob=".txt" gzip="false" lang="es-" size="655" type="asc">bWFydGVzIDUgZGUgbm92aWVtYnJlIGRlIDIwMTMgMTc6MzU6NDIgQ0VUIChkZW1vKQ0KRGVtbyBTcG9ydHMNCkRJQVJJT1MgQ09OVEFCTEVTDQoNCistLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnxJRCB8RGlhcmlvfERlc2NyaXBjafNuICAgICAgICAgIHwNCistLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwyNTh8QUEgICAgfERJQVJJT6BERaBMSVFVSURBQ0nTTnwNCnwyNjF8QU0gICAgfEFETUlOSVNUUkFDSdNOICAgICAgIHwNCnwyNjB8Q0EgICAgfENBSkEgICAgICAgICAgICAgICAgIHwNCnwyNTd8REMgICAgfERJQVJJT6BERaBDQUpBICAgICAgIHwNCnwyNTl8REcgICAgfERJQVJJT6BHRU5FUkFMICAgICAgIHwNCnwyNjJ8RFIgICAgfERJQVJJoERFoFJFUEFSVElNRU5UU3wNCnwyNjR8RFYgICAgfERpYXJpb6BkZaB2ZW50YXMgICAgIHwNCnwyNzl8TiAgICAgfE5VRVZPICAgICAgICAgICAgICAgIHwNCnwyNjh8U0YgICAgfERpYXJpbyBTRiAgICAgICAgICAgIHwNCistLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNClDhZ2luYSAxDQoNCg==</object>
</objresponse>
</objresponse>
</ns1:executeResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

[editar] 3.4 SOAPXMLServer

[editar] 3.4.1 Ejecutar un xsql-script sobre la base datos

  • SOAP Request:
Content-Type: text/xml; charset=utf-8
Content-Transfer-Encoding: 8bit
text/xml: text/xml;charset=utf-8
Content-ID: <23025815.1383670095562.apache-soap.deister_mac6>
Content-Length: 749
 
<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<ns1:executeXML xmlns:ns1="urn:SOAPXMLServer" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<database xsi:type="xsd:string">demo_sports</database>
<xml_code xsi:type="xsd:string">&lt;xsql-script name=&apos;hola_mundo&apos;&gt;
 
	&lt;body&gt;
 
		&lt;println&gt;Hola Mundo ....&lt;/println&gt;
 
		&lt;return&gt;
           &lt;string&gt;Hola Mundo&lt;/string&gt;
		&lt;/return&gt;
	&lt;/body&gt;
 
&lt;/xsql-script&gt;</xml_code>
</ns1:executeXML>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
  • SOAP Response:
<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<ns1:executeXMLResponse xmlns:ns1="urn:SOAPXMLServer" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<sqlresponse SOAP-ENV:encodingStyle="http://xml.apache.org/xml-soap/literalxml">
<sqlresponse country="ES" date="2013-11-05T16:48:14.388Z" date-format="dd-MM-yyyy" dbms="demo_sports" from="XMLSQLResultSetSerializer" host="web1" lang="es" number-format="#.##0,###" rows="1" time-format="HH:mm:ss" timestamp-format="dd-MM-yyyy HH:mm:ss" type="rawsql">
 <sqlinfo>
  <stdout><![CDATA[Hola Mundo ....
]]></stdout>
  <stderr><![CDATA[]]></stderr>
  <sqlstmt><![CDATA[&lt;xsql-script name=&apos;hola_mundo&apos;&gt;
 
	&lt;body&gt;
 
		&lt;println&gt;Hola Mundo ....&lt;/println&gt;
 
		&lt;return&gt;
           &lt;string&gt;Hola Mundo&lt;/string&gt;
		&lt;/return&gt;
	&lt;/body&gt;
 
&lt;/xsql-script&gt;]]></sqlstmt>
  <sqlsort/>
  <sqluser>demo</sqluser>
  <sqldbms>demo_sports</sqldbms>
  <sqlengine/>
  <sqllang>es-</sqllang>
  <sqltype/>
  <sqltime>0</sqltime>
  <sqlcount>0</sqlcount>
  <sqlserial>0</sqlserial>
  <sqlmaxrows>500</sqlmaxrows>
  <sqltables>
  </sqltables>
 </sqlinfo>
 <metadata>
  <column catalogName="" columnClassName="java.lang.String" columnDisplaySize="10" columnLabel="" columnName="(constant_1)" columnType="1" columnTypeName="char" isAutoIncrement="false" isCaseSensitive="false" isCurrency="false" isDefinitelyWritable="false" isHidden="false" isNullable="0" isNumeric="false" isPercent="false" isReadOnly="false" isRowid="false" isSigned="false" isTotal="false" isWritable="false" precision="0" scale="0" schemaName="" tableName=""/>
 </metadata>
 <rowset encoding="UTF-8" lang="es-">
  <r>
   <c>Hola Mundo</c>
  </r>
 </rowset>
</sqlresponse>
</sqlresponse>
</ns1:executeXMLResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

[editar] 4 Ejemplos clientes soap

Una petición soap puede formularse generando un mensaje XML que será transportado mediante el protocolo HTTP. La confención del mensaje XML (serialización) y el obtención de la respuesta (deserialización) puede realizarse mediante diferentes lenguajes.

A continuación se muestran algunos ejemplos en los lenguajes más comunes.

[editar] 4.1 XSQL client

En esta sección se muestran varios ejemplos de clientes SOAP usando el lenguaje XSQL-SCRIPTS.

[editar] 4.1.1 SOAPAPPServer.getPolicy

[editar] 4.1.1.1 Ejemplo 1

Obtener el idioma asignado al perfil de usuario. En caso de error devuelve el código y mensaje de error.

 <xsql-script name='getPolicy'>
    <body>
       <set name='m_response'>
          <soap.call
             url='http://web1/soap/servlet/rpcrouter'
             uri='urn:SOAPAPPServer'
             method='getPolicy'
             user='soap'
             password='soap999'
             >
          </soap.call>
       </set>
       <if><expr><soap.isFault><m_response/></soap.isFault></expr>
           <then>
                <println><soap.fault.getCode><m_response/></soap.fault.getCode></println>
                <println><soap.fault.getString><m_response/></soap.fault.getString></println>
           </then>
           <else>
               <println><map.get name='m_response'><string>lang</string></map.get></println>
           </else>
       </if>       
    </body>
 </xsql-script>

[editar] 4.1.1.2 Ejemplo 2

Obtener los datos de perfil del usuario en escritorio con identificador 0.

 <xsql-script name='getPolicy'>
    <body>
       <set name='m_response'>
          <soap.call
             url='http://web1/soap/servlet/rpcrouter'
             uri='urn:SOAPAPPServer'
             method='getPolicy'
             user='soap'
             password='soap999'
             >
               <parameters>
                  <parameter name = 'desk'>0</parameter>
               </parameters>    
          </soap.call>
       </set>
       <println><m_response/></println>
    </body>
 </xsql-script>

[editar] 4.1.2 SOAPAPPServer.getRoles

[editar] 4.1.2.1 Ejemplo 1

Obtener la lista de roles asignados al perfil de usuario.

 <xsql-script name='getRoles'>
   <body>
      <set name='m_response'>
         <soap.call
            url='http://web1/soap/servlet/rpcrouter'
            uri='urn:SOAPAPPServer'
            method='getRoles'
            user='soap'
            password='soap999'
            >
         </soap.call>
      </set>
      <println><m_response/></println>
   </body>
 </xsql-script>

[editar] 4.1.3 SOAPAPPServer.getServers

[editar] 4.1.3.1 Ejemplo 1

Obtener los servidores de base de datos que el usuario tiene acceso.

 <xsql-script name='getServers'>
    <body>
       <set name='m_response'>
          <soap.call
             url='http://web1/soap/servlet/rpcrouter'
             uri='urn:SOAPAPPServer'
             method='getServers'
             user='soap'
             password='soap999'
             >
          </soap.call>
       </set>
       <println><m_response/></println>
    </body>
 </xsql-script>

[editar] 4.1.4 SOAPAPPServer.getMenu

[editar] 4.1.4.1 Ejemplo 1

Obtener las opciones de menú con carpeta raíz es IGES-COM y subcarpeta COMACUPRO de la base de datos demo_sports.

 <xsql-script name='getMenu'>
    <body>
       <set name='m_response'>
          <soap.call
             url='http://web1/soap/servlet/rpcrouter'
             uri='urn:SOAPAPPServer'
             method='getMenu'
             user='soap'
             password='soap999'
             >
               <parameters>
                  <parameter name = 'dbms'>demo_sports</parameter>
                  <parameter name = 'code'>IGES-COM</parameter>
                  <parameter name = 'root'>COMACUPRO</parameter>
               </parameters>    
          </soap.call>
       </set>
       <println><m_response/></println>
    </body>
 </xsql-script>

[editar] 4.1.5 SOAPAPPServer.listFiles

[editar] 4.1.5.1 Ejemplo 1

Listar el contenido del directorio raíz y los subdirectorios almacenados en mi utilidad de disco.

 <xsql-script name='listFiles'>
    <body>
       <set name='m_response'>
          <soap.call
             url='http://web1/soap/servlet/rpcrouter'
             uri='urn:SOAPAPPServer'
             method='listFiles'
             user='soap'
             password='soap999'
             >
               <parameters>
                  <parameter name = 'tool'>disk</parameter>
                  <parameter name = 'path'>.</parameter>
                  <parameter name = 'expand'><true/></parameter>
               </parameters>    
          </soap.call>
       </set>
       <println><m_response/></println>
    </body>
 </xsql-script>

[editar] 4.1.6 SOAPAPPServer.setFileData

[editar] 4.1.6.1 Ejemplo 1

Transferir un fichero local al gestor de disco virtual usando un objeto File.

 <xsql-script name='setFileData'>
    <body>
       <set name='m_response'>
          <soap.call
             url='http://web1/soap/servlet/rpcrouter'
             uri='urn:SOAPAPPServer'
             method='setFileData'
             user='soap'
             password='soap999'
             >
           <parameters>
	     <parameter name='tool'>disk</parameter>
	     <parameter name='path'>/myfile.txt</parameter>
	     <parameter name='data'><file type='absolute' name='myfile.txt' /></parameter>
           </parameters>
          </soap.call>
       </set>
       <println><map.get name='m_response'><string>lang</string></map.get></println>
    </body>
 </xsql-script>

[editar] 4.1.6.2 Ejemplo 2

Transferir un fichero local al gestor de disco virtual usando un objeto DataHandler para poder indicar el content-type.

 <xsql-script name='setFileData'>
    <body>
       <set name='m_response'>
          <soap.call
             url='http://web1/soap/servlet/rpcrouter'
             uri='urn:SOAPAPPServer'
             method='setFileData'
             user='soap'
             password='soap999'
             >
           <parameters>
	     <parameter name='tool'>disk</parameter>
	     <parameter name='path'>/myfile.txt</parameter>
	     <parameter name='datahandler'><datahandler><datasource type='text/plain'><file type='absolute' name='myfile.txt' /></datasource></datahandler></parameter>
           </parameters>
          </soap.call>
       </set>
       <println><map.get name='m_response'><string>lang</string></map.get></println>
    </body>
 </xsql-script>

[editar] 4.1.7 SOAPXMLServer.executeXML

[editar] 4.1.7.1 Ejemplo 1

Invocar a un XSQL-SCRIPT.

<xsql-script name='callXSQLScript'>
    <body>
       <set name='m_response'>
          <soap.call
             url='http://web1/soap/servlet/rpcrouter'
             uri='urn:SOAPXMLServer'
             method='executeXML'
             user='soap'
             password='soap999'
             >
           <parameters>
	            <parameter name='database'>demo_formacion</parameter>
	            <parameter name='xml_code'>&lt;call name = "test_script">&lt;args>&lt;arg>TEST CALL SCRIPT&lt;/arg>&lt;/args>&lt;/call></parameter>
           </parameters>
          </soap.call>
       </set>
       <println><m_response/></println>
    </body>
 </xsql-script>

[editar] 4.1.8 SOAPOBJServer.getInclude

[editar] 4.1.8.1 Ejemplo 1

Obtener los valores del include gven_promocr_ambart cuya referencias al valor de la tabla gven_promocr.

<xsql-script name='getInclude1'>
  <body>
     <set name='m_response'>
        <soap.call
           url='http://web1/soap/servlet/rpcrouter'
           uri='urn:SOAPOBJServer'
           method='getInclude'
           user='soap'
           password='soap999'
           >
             <parameters>
                <parameter name = 'dbms'>demo_sports</parameter>
                <parameter name = 'include_code'>gven_promocr_ambart</parameter>
                <parameter name = 'filter_code'>gven_promocr</parameter>
                <parameter name = 'filter_cond'>cabid=105</parameter>
             </parameters>  
        </soap.call>
     </set>
     <println><m_response/></println>
  </body>
</xsql-script>

[editar] 4.1.8.2 Ejemplo 2

Obtener los valores del include acuerdos_estcab.

<xsql-script name='getInclude2'>
  <body>
     <set name='m_response'>
        <soap.call
           url='http://web1/soap/servlet/rpcrouter'
           uri='urn:SOAPOBJServer'
           method='getInclude'
           user='soap'
           password='soap999'
           >
             <parameters>
                <parameter name = 'dbms'>demo_sports</parameter>
                <parameter name = 'include_code'>acuerdos_estcab</parameter>
                <parameter name = 'filter_code'><string/></parameter>
                <parameter name = 'filter_cond'><string/></parameter>
             </parameters>  
        </soap.call>
     </set>
     <println><m_response/></println>
  </body>
</xsql-script>

[editar] 4.1.9 SOAPOBJServer.execute

[editar] 4.1.9.1 Ejemplo 1

Ejecutar el objeto gcompedh_print en formato pdf y guardar el fichero generado en la utilidad del disktool.

<xsql-script name='execute1'>
  <body>
     <set name='m_response'>
        <soap.call
           url='http://web1/soap/servlet/rpcrouter'
           uri='urn:SOAPOBJServer'
           method='execute'
           user='soap'
           password='soap999'
           >
             <parameters>
                <parameter name = 'dbms'>demo_sports</parameter>
                <parameter name = 'objcode'>gcompedh_print</parameter>
                <parameter name = 'qrycond'>gcompedh.cabid=19991</parameter>
                <parameter name = 'type'>pdf</parameter>
             </parameters>  
        </soap.call>
     </set>
     <if><expr><soap.isFault><m_response/></soap.isFault></expr>
         <then>
              <println><soap.fault.getCode><m_response/></soap.fault.getCode></println>
              <println><soap.fault.getString><m_response/></soap.fault.getString></println>
         </then>
         <else>
              <set name = 'm_pdf'>
                  <dom.node.getNodeValue>
                     <dom.node.getFirstChild>
                        <dom.getElementByXPath xpath='/objresponse/object'>
                            <dom.parse><m_response/></dom.parse>
                        </dom.getElementByXPath>
                     </dom.node.getFirstChild>
                   </dom.node.getNodeValue>
              </set>
              <if><expr><isnotnull><m_pdf/></isnotnull></expr>
                  <then>
                     <file.bytes.write>
                          <file name='gcompedh.pdf' type='disktool' />    
                          <byte.decode type='BASE64'><m_pdf/></byte.decode>
                     </file.bytes.write>
                  </then>
              </if>
         </else>
     </if>       
  </body>
</xsql-script>

[editar] 4.2 Java Client (Apache SOAP 2.3)

En esta sección, vamos a mostrar varios ejemplos de clientes java desarrollados usando las librerías APACHE SOAP.

[editar] 4.2.1 Requisitos previos

Para compilar o ejecutar los ejemplos detallados en este sección se requiere al menos las librerías que se detallan a continuación y que puede encontrar en common/lib/webstudio:

  • common/lib/webstudio/soap.jar (Apache Soap 2.3)
  • common/lib/webstudio/activation.jar (JavaBeans Activation Framework.)
  • common/lib/webstudio/mail/jmail_1_4_mail.jar (Java Mail 1.4)

[editar] 4.2.2 Compilación

Un ejemplo de compilación de un cliente java podría ser el siguiente, donde SOAPOBJClient1.java es el fichero de código java:

javac -classpath soap.jar SOAPOBJClient1.java

[editar] 4.2.3 Ejecución

Un ejemplo de ejecución de un cliente java podría ser el siguiente, donde SOAPOBJClient1 es el fichero de classe java, a la cual se le pasa dos argumentos:

java -classpath soap.jar;jmail_1_4_mail.jar;activation.jar;. SOAPOBJClient1 http://192.10.10.1/soap/servlet/rpcrouter demo_sports1

[editar] 4.2.4 SOAPOBJServer.execute

[editar] 4.2.4.1 Ejemplo 1

El siguiente ejemplo muestra como ejecutar el objeto catalogado bal_a_sal_p_nivel usando una llamada a la función SOAPOBJServer.execute(String database, String objname, String qrycond, Hashtable cols, Hashtable vars, String type, boolean gzip)

El objeto tiene las siguientes variables y campos de entrada:

Variable Descripción
NIVEL Nivel de agrupción
EJERIC Eercicio contable
PERINI Periodo inicial
PERFIN Periodo final
Campo Descripción
csaldos.empcode Código de sociedad
csaldos.proyec Proyecto contable
csaldos.seccio Sección contable
csaldos.cuenta Cuenta de balance
csaldos.sistem Sistema contable

El objeto contiene el siguiente código SQL:

SELECT csaldos.cuenta[1,$NIVEL] nivel,
   SUM(csaldos.debe) debe, SUM(csaldos.haber) haber
FROM csaldos
WHERE csaldos.ejerci = $EJERCI
AND csaldos.period BETWEEN $PERINI AND $PERFIN
AND $0
GROUP BY 1
INTO TEMP @tmp_1 WITH NO LOG;
 
SELECT @tmp_1.nivel, cniveles.nombre,
   SUM(@tmp_1.debe) debe, SUM(@tmp_1.haber) haber,
   SUM(CASE WHEN (@tmp_1.debe - @tmp_1.haber) > 0
            THEN (@tmp_1.debe - @tmp_1.haber)
            ELSE 0
        END) deudor,
   SUM(CASE WHEN (@tmp_1.debe - @tmp_1.haber) < 0
            THEN (@tmp_1.haber - @tmp_1.debe)
            ELSE 0
        END) acreedor,
   SUM(@tmp_1.debe - @tmp_1.haber) salacu
FROM @tmp_1 LEFT JOIN cniveles ON @tmp_1.nivel  = cniveles.codigo
WHERE @tmp_1.debe  != 0 OR
   @tmp_1.haber != 0
GROUP BY 1,2

El código fuente de la clase java que realiza la llamada al objeto bal_a_sal_p_nivel podría ser como este ejemplo:

// java
import java.net.URL;
import java.util.Vector;
import java.util.Hashtable;
 
// dom
import org.w3c.dom.Element;
 
// apache SOAP
import org.apache.soap.util.xml.DOM2Writer;
import org.apache.soap.Fault;
import org.apache.soap.Constants;
import org.apache.soap.SOAPException;
import org.apache.soap.rpc.Call;
import org.apache.soap.rpc.Parameter;
import org.apache.soap.rpc.Response;
import org.apache.soap.transport.http.SOAPHTTPConnection;
 
// java
import java.net.URL;
import java.util.Vector;
import java.util.Hashtable;
 
// dom
import org.w3c.dom.Element;
 
// apache SOAP
import org.apache.soap.util.xml.DOM2Writer;
import org.apache.soap.Fault;
import org.apache.soap.Constants;
import org.apache.soap.SOAPException;
import org.apache.soap.rpc.Call;
import org.apache.soap.rpc.Parameter;
import org.apache.soap.rpc.Response;
import org.apache.soap.transport.http.SOAPHTTPConnection;
 
/**
*
*/
public class SOAPOBJClient1
{
    /**
    * Un simple cliente
    */
    public static void main(String[] args) throws Exception
    {
        if (args.length != 2)
        {
            System.err.println("Usage:");
            System.err.println("  java " +
                SOAPOBJClient1.class.getName() +
                " url database"
            );
            System.exit (1);
        }
 
        // Tomamos los argumentos de la linea de comandos.
        int offset = 3 - args.length;
        URL url = new URL(args[1 - offset]);
        String database = args[2 - offset];
 
        //Construimos el objeto
        Call call = new Call();
 
        // Autentificacion
        SOAPHTTPConnection hc = new SOAPHTTPConnection();
        hc.setUserName("demo");
        hc.setPassword("abcdemo");
        call.setSOAPTransport(hc);
 
        call.setTargetObjectURI("urn:SOAPOBJServer");
        call.setMethodName("execute");
 
        // La codificacion de la respuesta es un org.w3c.dom.Element
        call.setEncodingStyleURI(Constants.NS_URI_LITERAL_XML);
 
        // Los argumentos del call
 
        String      objname = "bal_a_sal_p_nivel";
        String      qrycond = "";
        Hashtable   cols    = new Hashtable();
        Hashtable   vars    = new Hashtable();
        String      type    = "asc";
        Boolean     gzip    = new Boolean(false);
 
        cols.put("csaldos.cuenta", "[67]*");
 
        vars.put("NIVEL",  "1");
        vars.put("EJERCI", "2003");
        vars.put("PERINI", "0");
        vars.put("PERFIN", "12");
 
        Vector params = new Vector();
        params.addElement(
            new Parameter(
                "database",
                String.class,
                database,
                Constants.NS_URI_SOAP_ENC
            )
        );
        params.addElement(
            new Parameter(
                "objname",
                String.class,
                objname,
                Constants.NS_URI_SOAP_ENC
            )
        );
        params.addElement(
            new Parameter(
                "qrycond",
                String.class,
                qrycond,
                Constants.NS_URI_SOAP_ENC
            )
        );
        params.addElement(
            new Parameter(
                "cols",
                Hashtable.class,
                cols,
                Constants.NS_URI_SOAP_ENC
            )
        );
        params.addElement(
            new Parameter(
                "vars",
                Hashtable.class,
                vars,
                Constants.NS_URI_SOAP_ENC
            )
        );
        params.addElement(
            new Parameter(
                "type",
                String.class,
                type,
                Constants.NS_URI_SOAP_ENC
            )
        );
        params.addElement(
            new Parameter(
                "gzip",
                Boolean.class,
                gzip,
                Constants.NS_URI_SOAP_ENC
            )
        );
        call.setParams(params);
 
        // Invocamos la llamada
        Response resp;
        try
        {
            resp = call.invoke(url, "");
        } catch (SOAPException ex) {
            System.err.println("Caught SOAPException (" +
                        ex.getFaultCode() + "): " +
                        ex.getMessage()
            );
            ex.printStackTrace();
            return;
        }
 
        // Verificamos la respuesta y la mostramos
        if (!resp.generatedFault())
        {
            Parameter ret = resp.getReturnValue();
            Element element = (Element)ret.getValue();
            System.out.println(DOM2Writer.nodeToString(element));
        } else {
            Fault fault = resp.getFault();
            System.err.println("Fault code    :" + fault.getFaultCode());
            System.err.println("Fault string  :" + fault.getFaultString());
            System.err.println("Fault ActorURI:" + fault.getFaultActorURI());
            Vector details = fault.getDetailEntries();
            if (details != null) {
                while (details.size() > 0) {
                    Object data = details.remove(0);
                    System.err.println("Detail Entry  :" + data.getClass().getName());
                    System.err.println(data);
                }
            }
            Vector entries = fault.getFaultEntries();
            if (entries != null) {
                while (entries.size() > 0) {
                    Object data = entries.remove(0);
                    System.err.println("Fault Entry  :" +
                        data.getClass().getName());
                    System.err.println(data);
                }
            }
        } // if (!resp.generatedFault())
    } // main
} // SOAPOBJClient1

[editar] 4.2.4.2 Ejemplo 2

Este ejemplo muestra un cliente en el cual indicamos en que formato se desea obtener el resultado de ejecución de un objeto, que a su vez se la pasa como parámetro. El programa genera un fichero con el resultado de la ejecución según el formato seleccionado.

// java
import java.net.URL;
import java.util.Vector;
import java.io.InputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.OutputStream;
import java.io.FileOutputStream;
 
// dom
import org.w3c.dom.*;
 
// apache SOAP
import org.apache.soap.util.xml.DOM2Writer;
import org.apache.soap.util.xml.DOMUtils;
import org.apache.soap.Fault;
import org.apache.soap.Constants;
import org.apache.soap.SOAPException;
import org.apache.soap.rpc.Call;
import org.apache.soap.rpc.Parameter;
import org.apache.soap.rpc.Response;
import org.apache.soap.transport.http.SOAPHTTPConnection;
import org.apache.soap.encoding.soapenc.Base64;
 
/**
* Ejemplo de un cliente java usando apache soap para
* invokar la operación execute del servicio SOPAOBJServer
* Element execute(String database, String objcode, String qrycond, String type)
*/
 
public class SOAPExecuteObjClient
{
    /**
    * Un cliente simple para ejecutar un Objeto.
    */
    public static void main(String[] args) throws Exception
    {
        if (args.length != 7 && args.length != 9 && args.length != 11)
        {
            System.err.println("Usage:");
            System.err.println("  java " +
                SOAPExecuteObjClient.class.getName() +
                " url user pass database objcode qrycond type [proxyHost proxyPort] [proxyUser proxyPassword]"
            );
            System.exit (1);
        }
 
        // Tomamos los argumentos de la linea de comandos.
 
        URL url           = new URL(args[0]);
        String user       = args[1];
        String password   = args[2];
        String database   = args[3];
        String objcode    = args[4];
        String qrycond    = args[5];
        String type       = args[6];
 
 
        //Construimos el objeto
        Call call = new Call();
 
        // Autentificacion
        SOAPHTTPConnection hc = new SOAPHTTPConnection();
        hc.setUserName(user);             // USUARIO
        hc.setPassword(password);         // PASSWORD
        // Observe si usa un proxy!
        if (args.length >= 9)
        {
          hc.setProxyHost(args[7]);               //PROXY HOSTNAME
          hc.setProxyPort(Integer.parseInt(args[8]));  //PROXY PORT
 
          if (args.length == 11)
          {
             hc.setProxyUserName(args[9]); //PROXY USER
             hc.setProxyPassword(args[10]); //PROXY PASSWORD
          }
        }        
 
        call.setSOAPTransport(hc);
 
        call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
        call.setTargetObjectURI("urn:SOAPOBJServer");
        call.setMethodName("execute");
 
        // Pasamos 4 parametros a la funcion de ejecucion directa:
        // Element execute(String database, String objcode, String qrycond, String type)
 
 
        Vector params = new Vector();
        params.addElement(
            new Parameter(
                "database",
                String.class,
                database,
                Constants.NS_URI_SOAP_ENC
            )
        );
        params.addElement(
            new Parameter(
                "objcode",
                String.class,
                objcode,
                Constants.NS_URI_SOAP_ENC
            )
        );
 
        params.addElement(
            new Parameter(
                "qrycond",
                String.class,
                qrycond,
                Constants.NS_URI_SOAP_ENC
            )
        );
 
        params.addElement(
            new Parameter(
                "type",
                String.class,
                type,
                Constants.NS_URI_SOAP_ENC
            )
        );
 
        call.setParams(params);
 
        // Invocamos la llamada
        Response resp;
        try
        {
            resp = call.invoke(url, "");
        } catch (SOAPException ex) {
            System.err.println("Caught SOAPException (" +
                        ex.getFaultCode() + "): " +
                        ex.getMessage()
            );
            ex.printStackTrace();
            return;
        }
 
        //Visualizar mensaje de respuesta SOAP respuesta
        //System.out.println(call.getEnvelopeString(hc));
 
        // Verificamos la respuesta y la mostramos
        if (!resp.generatedFault())
        {
            Parameter ret = resp.getReturnValue();
            Element element = (Element)ret.getValue();
            // Obtenemos el inputStream del resultado (CDATA)
 
		    InputStream in = getObjectDataInputStream(element);		    
 
		    if (in == null)
				System.out.println(DOM2Writer.nodeToString(element));
			else
				inputStreamToFile (in, objcode, type);
        } else {
            Fault fault = resp.getFault();
            System.err.println("Fault code    :" + fault.getFaultCode());
            System.err.println("Fault string  :" + fault.getFaultString());
            System.err.println("Fault ActorURI:" + fault.getFaultActorURI());
            Vector details = fault.getDetailEntries();
            if (details != null) {
                while (details.size() > 0) {
                    Object data = details.remove(0);
                    System.err.println("Detail Entry  :" +
                        data.getClass().getName());
                    System.err.println(data);
                }
            }
            Vector entries = fault.getFaultEntries();
            if (entries != null) {
                while (entries.size() > 0) {
                    Object data = entries.remove(0);
                    System.err.println("Fault Entry  :" +
                        data.getClass().getName());
                    System.err.println(data);
                }
            }
        } // if (!resp.generatedFault())
    } // main
 
	public static final InputStream getObjectDataInputStream(Element el) throws IOException, Exception
	{
		Element listingEl = DOMUtils.getFirstChildElement(el);
		if (listingEl.getTagName().equals("object")) {
    		String gzip = listingEl.getAttribute("gzip");
	    	if (gzip.equalsIgnoreCase("true")) {
        		byte[] bdata = __parseBLOB(listingEl);
        		return new GZIPInputStream(new ByteArrayInputStream(bdata));
    		} else {
    			byte[] bdata = __parseBLOB(listingEl);
        		return new ByteArrayInputStream(bdata);
    		}
		} else if (listingEl.getTagName().equals("exception")) {
	    	// es una excepción de servicio
	    	return null;
		}
		// Es un documento mal formado!
		throw new IllegalStateException("element child tagname was ["
     	+ listingEl.getTagName() + "] expected was object");
	}
 
	private static byte[] __parseBLOB(org.w3c.dom.Element el) throws Exception
	{
    	String coldata = DOMUtils.getChildCharacterData(el);
 
    	return Base64.decode(coldata);
 
	}
 
	static void inputStreamToFile (InputStream in, String objcode, String type) throws IOException
	{
		//Setup directories
		File baseDir = new File(".");
		File outDir = new File(baseDir, "out");
		outDir.mkdirs();
		String destino = objcode + ".";
		if (type.equalsIgnoreCase("pdf"))
			destino = destino + "pdf";
		else if (type.equalsIgnoreCase("xml"))
			destino = destino + "xml";
		else if (type.equalsIgnoreCase("xls"))
			destino = destino + "xls";
		else
			destino = destino + "txt";
		File outfile = new File(outDir, destino);		
 
		OutputStream out= new FileOutputStream(outfile);
		byte[] buffer= new byte[256];
		while (true) {
			int n= in.read(buffer);
	    	if (n < 0)
        		break;
      		out.write(buffer, 0, n);
    	}
    	in.close();
    	out.close();
  	}
 
} // SOAPExecuteObjClient

[editar] 4.2.5 SOAPXMLServer.executeXML

[editar] 4.2.5.1 Ejemplo 1

En este ejemplo se muestra como ejecutar un proceso XSQL-SCRIPT al cual se le pasa un documento XML como argumento. Se trata de generar un pedido de ventas a partir de un fichero XML con un formato predeterminado. En nuestra caso un ejemplo del fichero XML podría ser el siguiente:

<pedido>
 <cabecera>
  <tipo>PVDS</tipo>
  <empresa>IASA</empresa>
  <delegacion>01</delegacion>
  <departamento>0</departamento>
  <fecha>13-05-2013</fecha>
  <cliente>0</cliente>
 </cabecera>
 <lineas>
  <linea>
   <articulo>000001</articulo>
   <cantidad>20</cantidad>
  </linea>
  <linea>
   <articulo>000002</articulo>
   <cantidad>10</cantidad>
  </linea>  
 </lineas>
</pedido>

El proceso XSQL-SCRIPT que genera el pedido de ventas seria como el siguiente ejemplo:

<xsql-script name='pedido_load'>
   <args>
      <arg name='p_xmlarg' type='string'/>
   </args>
   <body>
 
      <function name ='local_get_value'>
        <args>
            <arg name='p_root'/>
            <arg name='p_path' type='string'/>
        </args>
        <body>
          <return>
             <dom.node.getNodeValue>
                <dom.node.getFirstChild>
                   <dom.getElementByXPath xpath='#p_path'>
                       <p_root/>
                   </dom.getElementByXPath>
                </dom.node.getFirstChild>
              </dom.node.getNodeValue>
          </return>
        </body>
      </function>
 
      <set name = 'm_root'>
          <dom.parse><p_xmlarg/></dom.parse>
      </set>
      <set name = 'new_tipdoc'>
          <local_get_value>
             <m_root/>
             <string>/pedido/cabecera/tipo</string>
           </local_get_value>
      </set>
      <set name = 'new_empcode'>
          <local_get_value>
             <m_root/>
             <string>/pedido/cabecera/empresa</string>
           </local_get_value>
      </set>
      <set name = 'new_delega'>
          <local_get_value>
             <m_root/>
             <string>/pedido/cabecera/delegacion</string>
           </local_get_value>
      </set>
      <set name = 'new_depart'>
          <local_get_value>
             <m_root/>
             <string>/pedido/cabecera/departamento</string>
           </local_get_value>
      </set>
      <set name = 'new_fecha'>
          <date.parse format='dd-MM-yyyy'>
             <local_get_value>
                <m_root/>
                <string>/pedido/cabecera/fecha</string>
             </local_get_value>
          </date.parse>
      </set>
      <set name = 'new_tercer'>
          <local_get_value>
             <m_root/>
             <string>/pedido/cabecera/cliente</string>
           </local_get_value>
      </set>
 
      <call name='gvenpedh_init' into='v_gvenpedh'/>
 
      <vtable.insert name='v_gvenpedh' prefix='new_'/>
      <call name='gvenpedh_insert' into='m_cabid'>
         <string>INSERT</string>
         <v_gvenpedh/>
      </call>
 
      <select prefix='gvenpedh_'>
         <columns>
            rowid, docser, fecini, fecfin
         </columns>
         <from table='gvenpedh'/>
         <where>
            gvenpedh.cabid = <m_cabid/>
         </where>
      </select>
 
      <set name='m_lineas'>
         <dom.getElementByXPath xpath='/pedido/lineas'>
             <m_root/>
         </dom.getElementByXPath>
      </set>
 
      <if><expr><isnotnull><m_lineas/></isnotnull></expr>
          <then>
             <set name='m_linea'>
                 <dom.element.getFirstChildElement><m_lineas /></dom.element.getFirstChildElement>
             </set>
 
             <set name ='gvenpedl_cabid'><m_cabid/></set>
             <set name ='gvenpedl_orden'>1</set>
             <set name ='gvenpedl_entini'><gvenpedh_fecini/></set>
             <set name ='gvenpedl_entfin'><gvenpedh_fecfin/></set>
             <set name ='gvenpedl_varlog'>0</set>
             <set name ='gvenpedl_udmven'>UNI</set>
             <set name ='gvenpedl_precio'>0</set>
             <set name ='gvenpedl_dtolin'>0</set>
             <set name ='gvenpedl_numlot'>0</set>
             <set name ='gvenpedl_canser'>0</set>
             <set name ='gvenpedl_canext'>0</set>
             <set name ='gvenpedl_canadj'>0</set>
             <set name ='gvenpedl_estlin'>E</set>
             <set name ='gvenpedl_errlin'>0</set>
             <set name ='gvenpedl_entpar'>0</set>
             <set name ='gvenpedl_adjpar'>0</set>
             <set name ='gvenpedl_pedcom'>0</set>
             <set name ='gvenpedl_impnet'>0</set>
             <while>
                 <expr><isnotnull><m_linea/></isnotnull></expr>
                 <do>
                    <set name = 'm_node'>
                       <dom.parse><m_linea/></dom.parse>
                    </set>
                    <set name ='gvenpedl_codart'>
                       <local_get_value>
                          <m_node/>
                          <string>/linea/articulo</string>
                        </local_get_value>
                    </set>
                    <set name ='gvenpedl_canped'>
                       <local_get_value>
                          <m_node/>
                          <string>/linea/cantidad</string>
                        </local_get_value>
                    </set>
 
                    <insert table = 'gvenpedl' prefix = 'gvenpedl_'/>
 
                    <set name ='gvenpedl_orden'><add><gvenpedl_orden/>1</add></set>
 
                    <set name='m_linea'>
                         <dom.element.getNextSiblingElement><m_linea /></dom.element.getNextSiblingElement>
                    </set>
                 </do>
             </while>
          </then>
      </if>
 
      <call name='gvenpedh'>
         <string>V</string>
         <gvenpedh_rowid/>
      </call>
      <return><gvenpedh_docser/></return>
 
   </body>
</xsql-script>

El código java para el cliente SOAP seria como el siguiente ejemplo:

// java
import java.net.URL;
import java.util.Vector;
import java.io.File;
import java.io.FileInputStream;
import java.io.ByteArrayOutputStream;
 
 
// dom
import org.w3c.dom.*;
 
// apache SOAP
import org.apache.soap.util.xml.DOM2Writer;
import org.apache.soap.Fault;
import org.apache.soap.Constants;
import org.apache.soap.SOAPException;
import org.apache.soap.rpc.Call;
import org.apache.soap.rpc.Parameter;
import org.apache.soap.rpc.Response;
import org.apache.soap.transport.http.SOAPHTTPConnection;
 
 
/**
* org.w3c.dom.Element executeXML(String database, String xml_code, Vector<Object> arg_data)
*/
 
public class SOAPSCRIPTClient
{
 
    public static void main(String[] args) throws Exception
    {
        if (args.length < 5)
        {
            System.err.println("Usage:");
            System.err.println("  java " +
                SOAPSCRIPTClient.class.getName() +
                " url user pass database scriptcode xml_file"
            );
            System.exit (1);
        }
 
        // Tomamos los argumentos de la linea de comandos.
 
        URL url           = new URL(args[0]);
        String user       = args[1];
        String password   = args[2];
        String database   = args[3];
        String scriptcode = "<call name = '" + args[4] + "'/>";
        String xml = getXmlCodeFromFile(args[5]);
        Vector arg_data = new Vector();
        arg_data.addElement((Object) xml);
 
        //Construimos el objeto
        Call call = new Call();
 
        // Autentificacion
        SOAPHTTPConnection hc = new SOAPHTTPConnection();
        hc.setUserName(user);             // USUARIO
        hc.setPassword(password);         // PASSWORD
 
 
        call.setSOAPTransport(hc);
 
        call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
        call.setTargetObjectURI("urn:SOAPXMLServer");
        call.setMethodName("executeXML");
 
        // Pasamos 3 parametros a la funcion de ejecucion directa:
        // org.w3c.dom.Element executeXML(String database, String xml_code, Vector<Object> arg_data)
 
        Vector params = new Vector();
        params.addElement(
            new Parameter(
                "database",
                String.class,
                database,
                Constants.NS_URI_SOAP_ENC
            )
        );
        params.addElement(
            new Parameter(
                "xml_code",
                String.class,
                scriptcode,
                Constants.NS_URI_SOAP_ENC
            )
        );
 
        params.addElement(
            new Parameter(
                "arg_data",
                Vector.class,
                arg_data,
                Constants.NS_URI_SOAP_ENC
            )
        );
 
        call.setParams(params);
 
        // Invocamos la llamada
        Response resp;
        try
        {
            resp = call.invoke(url, "");
        } catch (SOAPException ex) {
            System.err.println("Caught SOAPException (" +
                        ex.getFaultCode() + "): " +
                        ex.getMessage()
            );
            ex.printStackTrace();
            return;
        }
 
        // Verificamos la respuesta y la mostramos
        if (!resp.generatedFault())
        {
            Parameter ret = resp.getReturnValue();
            Element element = (Element)ret.getValue();
            System.out.println(DOM2Writer.nodeToString(element));
        } else {
            Fault fault = resp.getFault();
            System.err.println("Fault code    :" + fault.getFaultCode());
            System.err.println("Fault string  :" + fault.getFaultString());
            System.err.println("Fault ActorURI:" + fault.getFaultActorURI());
            Vector details = fault.getDetailEntries();
            if (details != null) {
                while (details.size() > 0) {
                    Object data = details.remove(0);
                    System.err.println("Detail Entry  :" +
                        data.getClass().getName());
                    System.err.println(data);
                }
            }
            Vector entries = fault.getFaultEntries();
            if (entries != null) {
                while (entries.size() > 0) {
                    Object data = entries.remove(0);
                    System.err.println("Fault Entry  :" +
                        data.getClass().getName());
                    System.err.println(data);
                }
            }
        } // if (!resp.generatedFault())
    } // main
 
    /*
    * Recibe un string con nombre de fichero donde se almacena  el xml 
    * Retorna un String
    */
    private static String getXmlCodeFromFile (String p_filename) throws Exception
    {
       //Leer fichero
       java.io.File file_data =null;
       try{
          file_data = new java.io.File(p_filename);
       }catch (Exception ex){
          System.err.println(ex);
          System.exit(1);
       }
 
       if (!file_data.exists()) {
          System.err.println(p_filename + " No existe.");
          System.exit(1);
       }
 
       java.io.FileInputStream data_stream = new FileInputStream(file_data);
 
       Long l_size = new Long(file_data.length());
       int size = l_size.intValue();
       byte[] data_byte = new byte[size];
       data_stream.read(data_byte);
       java.io.ByteArrayOutputStream out = new ByteArrayOutputStream();
       out.write(data_byte,0,size);
       String xmldata = out.toString();
       return xmldata;
    }
 
 
} // SOAPSCRIPTClient

[editar] 4.3 Java Client (Apache Axis 1.x)

En esta sección, vamos a mostrar varios ejemplos de clientes java desarrollados usando las librerías AXIS.

[editar] 4.3.1 Requisitos previos

Para compilar o ejecutar los ejemplos descritos en esta sección se requiere como mínimo que dispongamos de los siguientes paquetes de APACHE AXIS:

  • axis.jar
  • jaxrpc.jar
  • wsdl4j-1.5.1.jar
  • commons-logging-1.0.4.jar
  • commons-discovery-0.2.jar

[editar] 4.3.2 Compilación

Un ejemplo de compilación de un cliente java podría ser el siguiente, donde AXISExecuteQueryClient.java es el fichero de código java:

javac  -classpath axis.jar;jaxrpc.jar AXISExecuteQueryClient.java

[editar] 4.3.3 Ejecución

Un ejemplo de ejecución de un cliente java podría ser el siguiente, donde AXISExecuteQueryClient es el fichero de classe java, a la cual se le pasa cuatro argumentos:

java -classpath axis.jar;jaxrpc.jar;wsdl4j-1.5.1.jar;commons-logging-1.0.4.jar;commons-discovery-0.2.jar;. AXISExecuteQueryClient
 http://webstudioserver/soap/servlet/rpcrouter USER PASSWORD demo_sports "SELECT COUNT(*) contador, MAX(docser) docser from gcomfach"

[editar] 4.3.4 SOAPSQLServer.executeQuery

[editar] 4.3.4.1 Ejemplo 1

En este ejemplo se muestra como invocar el servicio SOAPSQLServer.executeQuery para ejecutar una simple sentencia SQL.

// java
import java.net.URL;
import java.util.Hashtable;
 
//Apache Axis
import org.apache.axis.client.Service;
import org.apache.axis.client.Call;
import org.apache.axis.description.*;
import org.apache.axis.constants.Style;
import org.apache.axis.Constants;
import org.apache.axis.constants.Use;
import org.apache.axis.soap.SOAPConstants;
import javax.xml.namespace.QName;
 
public class AXISExecuteQueryClient
{
 
    public static void main(String args[]) throws Exception
    {
 
        if (args.length != 5)
        {
            System.err.println("Usage:");
            System.err.println("  java " +
                AXISExecuteQueryClient.class.getName() +
                " url user pass database sqlcmd"
            );
            System.exit (1);
        }
 
        // Tomamos los argumentos de la linea de comandos.
        int offset = 6 - args.length;
        URL url = new URL(args[1 - offset]);
        String user     = args[2 - offset];
        String password = args[3 - offset];
        String database = args[4 - offset];
        String sqlcmd   = args[5 - offset];
 
        // Observe si usa un proxy!
        /*
        System.getProperties().setProperty("http.proxySet", "true");
        System.getProperties().setProperty("http.proxyHost","proxy"); //PROXY HOSTNAME
        System.getProperties().setProperty("http.proxyPort", "8080"); //PROXY PORT
        */
 
        OperationDesc oper = new OperationDesc();
        oper.setName("executeQuery");
        ParameterDesc param = new ParameterDesc(new QName("", "database"), ParameterDesc.IN, new QName("http://www.w3.org/2001/XMLSchema", "string"), String.class, false, false);
        oper.addParameter(param);
        param = new ParameterDesc(new QName("", "sqlcmd"), ParameterDesc.IN, new QName("http://www.w3.org/2001/XMLSchema", "string"), String.class, false, false);
        oper.addParameter(param);
        oper.setReturnType(new QName("http://xml.apache.org/xml-soap", "Hashtable"));
        oper.setReturnClass(Hashtable.class);
        oper.setReturnQName(new QName("", "executeQueryReturn"));
        oper.setStyle(Style.RPC);
        oper.setUse(Use.ENCODED);
 
        Service service = new Service();
        Call _call = (Call) service.createCall();
        _call.setTargetEndpointAddress(url);
        _call.setSOAPVersion(SOAPConstants.SOAP11_CONSTANTS);
        _call.setEncodingStyle(Constants.URI_SOAP11_ENC);
 
        _call.setUsername(user);     // USUARIO
        _call.setPassword(password); // PASSWORD
        _call.setOperation(oper);
        _call.setUseSOAPAction(true);
        _call.setSOAPActionURI("");
        _call.setOperationName(new QName("urn:SOAPSQLServer", "executeQuery"));
 
        Object _resp = _call.invoke(new Object[] {database, sqlcmd});
 
        Hashtable m_ret = (Hashtable) _resp;
        System.out.println(m_ret.toString());        
 
    }
}

[editar] 4.4 Microsoft VB Client

Ejemplo de llamada a SOAPSQLServer.executeSQL(host, db, sqlstatement)

function DeisterSQL( server, database, sqlcmd )
{
/*****************************************************************/
/* Invocación al método execute del Web Service SOAPSQLServer
/*****************************************************************/
  Response.Buffer = true;
  var httpObj, xmlout, xmlin;           // Peticción http, Mensajes de Salida y Entrada
  var xml;                  // String XML
  targetObjectURI= "urn:SOAPSQLServer";     // URI: Web Service Remoto a Ejecutar
  method = "execute";               // Método Remoto a Ejecutar
 
  xmlObj = Server.CreateObject("MSXML2.DOMDocument");
  httpObj = Server.CreateObject("MSXML2.XMLHTTP");
 
  /* Construcción del Mensaje SOAP */
 
  xml="<?xml version='1.0' encoding='ISO-8859-1'?>";
  xml = xml +"<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema'>";
  xml = xml +"<SOAP-ENV:Body>";
  xml = xml +"<ns1:"+ method +" xmlns:ns1='"+ targetObjectURI +"' SOAP-ENV:encodingStyle='http://xml.apache.org/xml-soap/literalxml'>";
  xml = xml +"<database xsi:type='xsd:string' SOAP-ENV:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'>"+database+"</database>";
  xml = xml +"<sqlcmd xsi:type='xsd:string' SOAP-ENV:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'>"+sqlcmd+"</sqlcmd>";
  xml = xml +"</ns1:"+ method +">";
  xml = xml +"</SOAP-ENV:Body>";
  xml = xml +"</SOAP-ENV:Envelope>";
 
 
  xmlObj.loadXML(xml);
 
  /* Construcción de la Petición HTTP */
 
  //httpObj.Open("POST", server + "/soap/servlet/rpcrouter", false);
  url = server +"/soap/servlet/rpcrouter";
  httpObj.Open("POST", url, false, "oys", "david");
  httpObj.setRequestHeader ("SOAPAction", "execute");
  httpObj.setRequestHeader ("Content-Type", "text/xml");
  httpObj.setRequestHeader ("charset", "ISO-8859-1");
 
  /* Autorización: Código BASE64 de la combinación usuario:password   */
 
  httpObj.setRequestHeader ("Authorization", "Basic ZGF2aWRsYXNlcmFzOmRhdmlkbGFzZXJhcw==");
 
  /* Envio de la petición HTTP y Recepción de los Datos */
 
  httpObj.send(xmlObj);
 
  /*******************************/
  /* Pendiente Control de Estado */
  /*******************************/
  return(httpObj.responseText);
}
/*****************************************************************/
/* Conversión de XML-SOAP de Respuesta en Recordset
/*****************************************************************/
function DeisterXML2RS( xml, DeiRS )
{
  var xml;              // String XML con el Mensaje de Respuesta SOAP
  var source, result            // XML Antes y después de Transformar
 
  source = Server.CreateObject("MSXML2.DOMDocument");
  style = Server.CreateObject("MSXML2.DOMDocument");
  result = Server.CreateObject("MSXML2.DOMDocument");
  style0 = Server.CreateObject("MSXML2.DOMDocument");
  result0 = Server.CreateObject("MSXML2.DOMDocument");
//  DeiRS = Server.CreateObject("ADODB.RecordSet");
  DeiRS.ActiveConnection = "Provider=MSDAOSP; Data Source=MSXML2.DSOControl.4.0;";
 
  /**** Carga de la respuesta SOAP-XML    ****/
 
  source.loadXML(xml);
 
  /**** Carga del Fichero de Transformación ***/
 
  style.async = false;
  style.load(Server.mappath("../interfase/entrada/deister.xsl"));
 
  /****  Transformación XSL de la respuesta SOAP **/
 
  result.async = false;
  result.validateOnParse = true;
  source.transformNodeToObject(style, result);
 
  /*** Carga del 2º Fichero de Transformación para quitar namespaces *****/
 
  style0.async = false;
  style0.load(Server.mappath("../interfase/entrada/deister0.xsl"));
 
  /*** 2ª Transformación           **********/
 
  result.transformNodeToObject(style0, result0);
 
  /*** Se grava el XML resultado en un fichero Temporal *****/
 
  result0.save(Server.mappath("../interfase/entrada/deistertmp.xml"));
 
  DeiRS.Open(Server.mappath("../interfase/entrada/deistertmp.xml"));
}
function MakeXSL(fields)
{
  style = Server.CreateObject("MSXML2.DOMDocument");
  style0 = Server.CreateObject("MSXML2.DOMDocument");
  /****** STRING de XSL *************/
  str ="<?xml version='1.0' encoding='ISO-8859-1'?>";
  str = str + "<xsl:stylesheet version='1.0' xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:ns1='urn:SOAPSQLServer'>";
  str = str + "<xsl:output method='xml' encoding='ISO-8859-1'/>"
  str = str + "<xsl:template match='/'>";
  str = str + "<rowset>";
  str = str + "<xsl:for-each select='SOAP-ENV:Envelope/SOAP-ENV:Body/ns1:executeResponse/return/sqlresponse/rowset/row'>";
  str = str + "<row>";
  for (m=0;m<fields.length;m++)
  {
    str = str + "<" + fields[m] + ">";
    str = str + "<xsl:value-of select='" + fields[m]+ "'/>";
    str = str + "</" + fields[m] + ">";
  }
  str = str + "</row>";
  str = str + "</xsl:for-each>";
  str = str + "</rowset>";
  str = str + "</xsl:template>";
  str = str + "</xsl:stylesheet>";
 
  style.loadXML(str);
  style.save (Server.mappath("../interfase/entrada/deister.xsl"));
 
  /****** STRING de XSL *************/
  str ="<?xml version='1.0' encoding='ISO-8859-1'?>";
  str = str + "<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>";
  str = str + "<xsl:output method='xml' encoding='ISO-8859-1'/>"
  str = str + "<xsl:template match='/'>";
  str = str + "<rowset>";
  str = str + "<xsl:for-each select='rowset/row'>";
  str = str + "<row>";
  for (m=0;m<fields.length;m++)
  {
    str = str + "<" + fields[m] + ">";
    str = str + "<xsl:value-of select='" + fields[m]+ "'/>";
    str = str + "</" + fields[m] + ">";
  }
  str = str + "</row>";
  str = str + "</xsl:for-each>";
  str = str + "</rowset>";
  str = str + "</xsl:template>";
  str = str + "</xsl:stylesheet>";
 
  style.loadXML(str);
  style.save (Server.mappath("../interfase/entrada/deister0.xsl"));
 
  style = null;
  style0 = null;
}

[editar] 4.5 Perl Client

El siguiente ejemplo muestra una llamada a al servicio SOAPXMLServer.executeXML(String database, String code)

[editar] 4.5.1 Requisitos previos

Require el paquete SOAP::Lite

[editar] 4.5.2 Ejecución

perl soap.pl

[editar] 4.5.3 Código ejemplo

#!/usr/bin/perl -w
 
use SOAP::Lite;
#use SOAP::Lite +trace => 'debug';
 
while ( 1 eq 1 ){
        print "Introduzca ubicación: ";
        $codubi = <STDIN>;
        chomp ($codubi);
        print "Introduzca propuesta: ";
        $propuesta = <STDIN>;
        chomp ($propuesta);
 
 
        $xml = '<call name="user_xsql_script"><args><arg
        name="p_docser">'.$propuesta.'</arg><arg
        name="p_codubi">'.$codubi.'</arg></args></call>';
 
        my $soap_response = SOAP::Lite
        -> uri('urn:SOAPXMLServer')
        -> proxy('http://web1/soap/servlet/rpcrouter')
        -> executeXML(SOAP::Data->type('string')->name('database')->value('demo_test'),SOAP::Data->type('string')->name('code')->value($xml));
 
        my $res = $soap_response->valueof('//errmessg');
        my $trc = $soap_response->valueof('//errtrace');
        my $ok = $soap_response->valueof('//_constant_1_');
        if (defined($res)) {
                print "\n==================================================================\n";
                print " $res \n";
                print " $trc \n"; # Solo imprimir en caso de debug
                print "\n==================================================================\n";
                }
        if (defined($ok)) {
                print "\n\n$ok \n\n";
        }       
}

[editar] 4.6 PHP Client

El siguiente ejemplo muestra una llamada a al servicio SOAPXMLServer.executeXML(String database, String code)

[editar] 4.6.1 Código ejemplo

<?php
 
   // The XML command to execute in the remote server
   $xml = '<call name="garticul_getubi"><args><arg name="p_codalm">0925</arg><arg name="p_codart">98044582</arg></args></call>';
 
   // Create the soap instance
   $client = new SoapClient(null, 
      array(
        'location' => "http://192.168.10.10/soap/servlet/rpcrouter",
        'uri' => "urn:SOAPXMLServer",
        'login' => "myuserid",
        'password' => "myuserpasswd",
        'trace' => 1,
      )
   );
 
   // Make the call
   $return = $client->__soapCall("executeXML", array("database"=>"mydbname","code"=>$xml));
 
   // Print the resulting data
   print_r( $return );
?>

[editar] 4.7 RAW Java client

Cuando en Java no dispone de una biblioteca de serialización como apache SOAP (en un dispositivo Android) puede confeccionar directamente los menajes soap y negociar con el servidor en protocolo http directo. Este mencanismo requiere conocimentos más avanzados de Java y de interoperabilidad con SOAP. El proceso de serialización y deserialización puede resultar especialmente complejo. El siguiente ejemplo muestra una rutina de llamada al servicios SOAPSQLServer.executeSQL(String database, String stmt)

[editar] 4.7.1 Código ejemplo

/*
 * @(#)soap.java
 *
 * Copyright 1997, 2014 DEISTER, S.A.
 * San Pedro Claver 15, 08017 BARCELONA
 * Todos los derechos reservados.
 *
 * Este software es confidencial y contiene informacion propiedad
 * de DEISTER, S.A. Usted no puede publicar esta informacion y solo
 * puede utilizarla en los terminos de la licencia de uso que ha
 * firmado con DEISTER.
 *
 *
 * "C:\Program Files\Java\jdk1.6.0_43\bin\javac"
 *
 *
 */
 
// java.sql
import java.sql.ResultSet;
 
// java.io
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
// java.net
import java.net.URL;
import java.net.HttpURLConnection;
 
// java.util.zip
import java.util.zip.GZIPOutputStream;
import java.util.zip.GZIPInputStream;
 
public class soap {
 
    protected static final String       URI_XML_LITERALXML  = "http://xml.apache.org/xml-soap/literalxml";
    protected static final String       URI_SOAP_ENCODING   = "http://schemas.xmlsoap.org/soap/encoding/";
    protected static final String       WEBSTUDIO_RPCROUTER = "/soap/servlet/rpcrouter";
 
    public static void main(String[] args) throws Exception
    {
        if (args.length != 5)
        {
            System.err.println("Usage:");
            System.err.println("  java soap host port database user pass"
            );
            System.exit (1);
        }
 
        String host     = args[0];  // ex. 192.168.10.10
        int    port     = Integer.valueOf(args[1]); // ex. 80
        String database = args[2];  // ex. demo_vodafone
        String user     = args[3];  // ex. username
        String password = args[4];  // ex. password
 
        // ATENCION: El SQL que hago es "SELECT * FROM systables" se puede cambiar por lo que se desee.
 
        System.err.println("Test in progress...");
        try {
            String res = executeSQL(host, port, user, password, database, "SELECT * FROM systables WHERE tabname='systables'");
            System.err.println(res);
            System.err.println("\tCall is done. See the logs in 'wic_conf.wic_user_soaplogs' to check the access, please.");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        System.err.println("End test.");
    }
 
 
    public final static String executeSQL(
        String  host,
        int     port,
        String  user,
        String  password,
        String  database,
        String  stmt
    )
        throws IOException, org.xml.sax.SAXException, javax.xml.parsers.ParserConfigurationException
    {
        StringBuffer buf = new StringBuffer();
        buf.append("<?xml version='1.0' encoding='UTF-8'?>\n");
        buf.append("<SOAP-ENV:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'>\n");
        buf.append("<SOAP-ENV:Body>\n");
        buf.append("<ns1:executeSQL xmlns:ns1='urn:SOAPSQLServer' SOAP-ENV:encodingStyle='" + URI_XML_LITERALXML + "'>\n");
        buf.append("<database xsi:type='xsd:string' SOAP-ENV:encodingStyle='" + URI_SOAP_ENCODING + "'>" + database + "</database>\n");
        buf.append("<sql xsi:type='xsd:string' SOAP-ENV:encodingStyle='" + URI_SOAP_ENCODING + "'>" + encodeXML(stmt) + "</sql>\n");
        buf.append("</ns1:executeSQL>\n");
        buf.append("</SOAP-ENV:Body>\n");
        buf.append("</SOAP-ENV:Envelope>\n");
 
        InputStream in = SOAPCall(host, port, user, password, buf.toString());
 
        if (in == null)
            return null;
 
        // Convert response to text
        InputStreamReader is = new InputStreamReader(in);
        StringBuilder sb = new StringBuilder();
        BufferedReader br = new BufferedReader(is);
        String read = br.readLine();
        while(read != null) {
            sb.append(read);
            sb.append("\n");
            read = br.readLine();
        }
 
        return sb.toString();
    }
 
    public final static InputStream SOAPCall(
        String  host,
        int     port,
        String  user,
        String  password,
        String  xmlmsg
    )
        throws IOException, org.xml.sax.SAXException, javax.xml.parsers.ParserConfigurationException
    {
 
        URL u = new URL("http", host, port, WEBSTUDIO_RPCROUTER);
        HttpURLConnection connection = (HttpURLConnection)u.openConnection();
        HttpURLConnection.setFollowRedirects(true);
        connection.setDoInput(true);
        connection.setDoOutput(true);
        connection.setUseCaches(false);
        connection.setRequestMethod("POST");
        connection.setAllowUserInteraction(false);
        connection.setRequestProperty("Accept-Encoding", "gzip");
        connection.setRequestProperty("Content-Type", "text/xml;charset=utf-8");
        connection.setRequestProperty("Content-Encoding", "gzip");
 
        String token = user + ":" + password;
        String realm = new String(encodeBase64(token.getBytes()));
        connection.setRequestProperty("Authorization", "Basic " + realm);
        connection.setRequestProperty("SOAPAction", "");
        OutputStream       out  = connection.getOutputStream();
        OutputStreamWriter wout = new OutputStreamWriter(new GZIPOutputStream(out));
        wout.write(xmlmsg);
        wout.flush();
        wout.close();
 
        String contentEncoding  = connection.getContentEncoding();
        int contentLength       = connection.getContentLength();
        String contentType      = connection.getContentType();
 
        InputStream in;
        if (connection.getResponseCode() != 200) {
            // Get the ERROR Stream
            if ("gzip".equals(contentEncoding))
                in = new GZIPInputStream(connection.getErrorStream());
            else
                in = connection.getErrorStream();
        } else {
            if ("gzip".equals(contentEncoding))
                in = new GZIPInputStream(connection.getInputStream());
            else
                in = connection.getInputStream();
        }
 
        return in;
    }
 
    /**************************************************************************
    *
    *
    *
    *   XML ENCODE
    *
    *
    *
    ***************************************************************************/
    public final static String encodeXML(String input)
    {
        if (input == null)
            return "";
        int size = input.length();
        StringBuilder buf = new StringBuilder(size + size / 8);
 
        for(int i = 0; i < size; i++) {
            char c = input.charAt(i);
            switch(c) {
                // To avoid: An invalid XML character (Unicode: 0x1a) was found
                // It occurs when someone pastes in text that contains specific unicode characters that are invalid in XML
                case 0x1A:  buf.append(" ");        break;
                case '"':   buf.append("&quot;");   break;
                // La ' ha de ser codificable en un attribute per exemple com &apos;
                // I en un texte, no pasa res (sembla) si es codificada
                case '\'':  buf.append("&apos;");   break;
                case '>':   buf.append("&gt;");     break;
                case '<':   buf.append("&lt;");     break;
                case '&':   buf.append("&amp;");    break;
                default:    buf.append(c);
            }
        }
        return buf.toString();
    }
 
    /**************************************************************************
    *
    *
    *
    *   BASE64 ENCODE
    *
    *
    *
    ***************************************************************************/
 
    // Mapping table from 6-bit nibbles to Base64 characters.
    private final static char[] map1 = new char[64];
    static {
        int i=0;
        for (char c='A'; c<='Z'; c++) map1[i++] = c;
        for (char c='a'; c<='z'; c++) map1[i++] = c;
        for (char c='0'; c<='9'; c++) map1[i++] = c;
        map1[i++] = '+'; map1[i++] = '/';
    }
 
 
    /**
    * Encodes a byte array into Base64 format.
    * No blanks or line breaks are inserted in the output.
    * @param in  An array containing the data bytes to be encoded.
    * @return    A character array containing the Base64 encoded data.
    */
    public final static char[] encodeBase64 (byte[] in) {
        return encodeBase64(in, 0, in.length);
    }
 
    /**
    * Encodes a byte array into Base64 format.
    * No blanks or line breaks are inserted in the output.
    * @param in    An array containing the data bytes to be encoded.
    * @param iLen  Number of bytes to process in <code>in</code>.
    * @return      A character array containing the Base64 encoded data.
    */
    public final static char[] encodeBase64 (byte[] in, int iLen) {
        return encodeBase64(in, 0, iLen);
    }
 
    /**
    * Encodes a byte array into Base64 format.
    * No blanks or line breaks are inserted in the output.
    * @param in    An array containing the data bytes to be encoded.
    * @param iOff  Offset of the first byte in <code>in</code> to be processed.
    * @param iLen  Number of bytes to process in <code>in</code>, starting at <code>iOff</code>.
    * @return      A character array containing the Base64 encoded data.
    */
    public final static char[] encodeBase64 (byte[] in, int iOff, int iLen) {
        int oDataLen = (iLen*4+2)/3;       // output length without padding
        int oLen = ((iLen+2)/3)*4;         // output length including padding
        char[] out = new char[oLen];
        int ip = iOff;
        int iEnd = iOff + iLen;
        int op = 0;
        while (ip < iEnd) {
            int i0 = in[ip++] & 0xff;
            int i1 = ip < iEnd ? in[ip++] & 0xff : 0;
            int i2 = ip < iEnd ? in[ip++] & 0xff : 0;
            int o0 = i0 >>> 2;
            int o1 = ((i0 &   3) << 4) | (i1 >>> 4);
            int o2 = ((i1 & 0xf) << 2) | (i2 >>> 6);
            int o3 = i2 & 0x3F;
            out[op++] = map1[o0];
            out[op++] = map1[o1];
            out[op] = op < oDataLen ? map1[o2] : '='; op++;
            out[op] = op < oDataLen ? map1[o3] : '='; op++;
        }
        return out;
    }
}

[editar] 5 Monitorización

Cualquier operación SOAP se registra en la tabla wic_user_soaplogs de la base de datos de configuración wic_conf.

SOAP Logs
EL registro de la actividad SOAP en esta tabla solo se realiza para los usuarios que tengan habilitado el registro de los logs para las operaciones SOAP en el grupo de conexión a base de datos al cual pertenecen.

[editar] 6 Llamadas a servicios SOAP externos

No forma parte del ámbito de este documento explicar como realizar llamadas SOAP a servicios externos. Para realizar una llamada a un servicio externo mediante Java del que posee un descriptor WSDL puede utilizar herramientas como wsdl2java del proyecto Apache CXF. Y de forma más sencilla utilizando el pluggin de Eclipse.