SOAP
(originally Simple Object Access Protocol) is a messaging protocol specification for exchanging structured information in the implementation of web services in computer networks. Its purpose is to provide extensibility, neutrality and independence. It uses XML Information Set for its message format, and relies on application layer protocols, most often Hypertext Transfer Protocol (HTTP) or Simple Mail Transfer Protocol (SMTP), for message negotiation and transmission.
SOAP
allows processes running on disparate operating systems (such as Windows and Linux) to communicate using Extensible Markup Language (XML). Since Web protocols like HTTP are installed and running on all operating systems, SOAP
allows clients to invoke web services and receive responses independent of language and platforms.
1 Configuring call
You can easily create a SOAP
client to perform SOAP
calls by using SOAPClient and
a consumer configurator:
<script> var soap = new Ax.net.SOAPClient("http://www.acme.com/soap/servlet/rpcrouter", options => { options.setUser("user"); options.setPassword("password"); // Enable request/response copy. After call we can see both messages by asking: // soap.getRequestCopy() // soap.getReponseCopy() options.setRequestCopy(); options.setResponseCopy(); // Force connection using digest AUTH. If server is using BASIC auth, connection will fail. // Default is false. In that case client tries BASIC and if fails switches to DIGEST. // options.setDigest(true); }); </script>
The object returned is cached across multiple calls for same options. This optimizes memory on multiple request and allows to perform statistics collection on this object.
Options configuration allow to configure connection parameters:
Return | Options | Description |
---|---|---|
Protocol | ||
SOAPClientConfig | setGzip(boolean gzipenabled) | Enable compression (default is false).
When using compression, debug resquest copy and response copy will be compressed. So
during debug, dissable compression if you want to inspect
SOAP message body.
|
SOAPClientConfig | setTimeout(int seconds) | The HTTP timeout (0 if not defined) |
SOAPClientConfig | setEncodingStyle(String encodingStyle) | Sets the encoding style for this SOAPElement object to one specified. |
Authentication | ||
SOAPClientConfig | setUser(String user) | Configures user to authenticate thru digest authentication. |
SOAPClientConfig | setPassword(String pass) | Defines password to authenticate thru digest authentication. |
SOAPClientConfig | setDigest(boolean onlydigest) | If true, indicates to use only Digest authentication when performing the SOAP call.
If False, first system tries a Basic authentication and if fails, it tries to perform a Digest authentication.
|
SOAPClientConfig | setSSLProtocol(String protocol) | Setup the SSLContext protocol (default TSL). |
SOAPClientConfig | setSSLTrustAllFactory(boolean trustall) | Trust any certificate provided by server connected even it's not known or invalid. |
SOAPClientConfig | setSSLClientKeyStore(InputStream keystoreStream, String keystorePassword, String keystoreAlias) | Defines client authentication using certificates. If keystoreAlias is null, soap will use first certificate in keystore. |
Proxy | ||
SOAPClientConfig | setProxyHost(String host) | The proxy host (if need) |
SOAPClientConfig | setProxyPort(int port) | The proxy port |
SOAPClientConfig | setProxyUser(String user) | The proxy user (if need) |
SOAPClientConfig | setProxyPassword(String password) | The proxy password |
Debug | ||
SOAPClientConfig | setRequestCopy() | Indicate SOAP to keep a copy of request XML message that can be retrieved after call by using soap.getRequestCopy() |
SOAPClientConfig | setResponseCopy() | Indicate SOAP to keep a copy of response XML message that can be retrieved after call by using soap.getResponseCopy() |
2 Call a remote endpoint
Once you have a SOAP
object configured you can perfom the SOAP
call. The SOAP
call method
will return a SOAP
Response Object.
Return | Options | Description |
---|---|---|
JSSOAPResponse | call(Consumer<SOAPCallConfig> configurator) | . |
JSSOAPResponse | call(String service, String method, Object...args) | . |
N/A | addMapping(String serviceName, Class<?> bean) | . |
N/A | stats() | . |
MemoryResultSet | getClientStatistics() | A memory ResultSet with client statistics |
MemoryResultSet | getServerStatistics() | A memory ResultSet with server statistics |
String | getRequestCopy() | The request SOAP XML message if setRequestCopy() has been called during configuration or null. |
String | getResponseCopy() | The response SOAP XML message if setRequestCopy() has been called during configuration or null. |
Soap call configuration (SOAPCallConfig):
Return | Options | Description |
---|---|---|
N/A | setServiceName(String service) | . |
N/A | setAction(String action) | Set SOAP Action URI |
N/A | setBody(String strxml) | Allows to set full SOAP Body (<soap:Body>) message from a String. |
N/A | setHeader(String strxml) | Allows to set full SOAP Head (<soap:Header>) message from a String. |
N/A | addParameter(String name, Object arg) | Allows to set SOAP Body parameters. Parameter name is constructed as xml tag and arg is the content of this tag. |
Envelope | getEnvelope() | Returns Envelope component of SOAP Message. |
Soap call return object (JSSOAPResponse):
Return | Options | Description |
---|---|---|
Object | getValue() | Retrive the result. |
int | getStatusCode() | Retrive the http status code. |
String | getFaultCode() | Retrive the error code in the SOAP call. |
String | getFaultString() | Retrive the message error in the SOAP call. |
Vector | getFaultEntries() | Retrieve a vector with application-specific error messages. The detail element can contain child elements called detail entries. |
Vector | getDetailEntries() | Retrieve a vector with the detail application-specific error messages. |
3 Examples
3.1 Axional time server
The following example shows a call to an Axional Server time service.
var soap = new Ax.net.SOAPClient("http://www.myserver.com/soap/servlet/rpcrouter", options => { options.setUser("username"); options.setPassword("password"); options.addRequestHeader("Connection", "close"); options.setRequestCopy(); options.setResponseCopy(); }); console.log(soap.call("SOAPAPPServer", "getServerTime")); console.log(""); console.log("*** REQUEST *** "); console.log(""); console.log(soap.getRequestCopy()); console.log(""); console.log("*** RESPONSE*** "); console.log(""); console.log(soap.getResponseCopy());
SOAPResponse: value=1573765951085
*** REQUEST ***
POST /soap/servlet/rpcrouter HTTP/1.0
Host: www.mydeister.com
Content-Type: text/xml;charset=utf-8
Content-Length: 409
Connection: close
SOAPAction: ""
Authorization: Basic XXXXXXXXXX=
<?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:getServerTime xmlns:ns1="urn:SOAPAPPServer" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
</ns1:getServerTime>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
POST /soap/servlet/rpcrouter HTTP/1.0
Host: www.mydeister.com
Content-Type: text/xml;charset=utf-8
Content-Length: 409
SOAPAction: ""
Authorization: Basic XXXXXXXXXX=
*** 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:getServerTime xmlns:ns1="urn:SOAPAPPServer" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
</ns1:getServerTime>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
<?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:getServerTimeResponse xmlns:ns1="urn:SOAPAPPServer" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<return xsi:type="xsd:long">1573765951085</return>
</ns1:getServerTimeResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
3.2 SiiFactFEV1SOAP
SiiFactFEV1SOAP - SII – Suministro Inmediato de Información
<script> var xmlcmd = ` <ns2:ConsultaLRFacturasEmitidas> <ns1:Cabecera> <ns1:IDVersionSii>1.1</ns1:IDVersionSii> <ns1:Titular> <ns1:NombreRazon>ACME</ns1:NombreRazon> <ns1:NIF>73209131Q</ns1:NIF> </ns1:Titular> </ns1:Cabecera> <ns2:FiltroConsulta> <ns1:PeriodoImpositivo> <ns1:Ejercicio>2019</ns1:Ejercicio> <ns1:Periodo>01</ns1:Periodo> </ns1:PeriodoImpositivo> </ns2:FiltroConsulta> </ns2:ConsultaLRFacturasEmitidas> `; var ksc = new Ax.io.File('/tmp/test_sii_cert.pfx'); ksc.write(Ax.util.Base64.decode('MIACAQMwgAYJKoZIhvcNAQcBoIAkgASCHVUwgDCABgkqhkiG9w0BBwGggCSABIIF7TCCBekwggXlBgsqhkiG9w0BDAoBAqCCBPYwggTyMCQGCiqGSIb3DQEMAQMwFgQQNYGBBU2+Bo2SXSUJzqpLOQICB9AEggTIxmJ18+dWjiakVDad/8dAcG1vcxu1Il16o7zlwsGXKjCimgBLwd0iEydfYhn05k2S6KDsL6qcJOy7YT2S99t+5t9TxfNqS3vDeAWPgECb7xX5Z63xwdksSQ2XJIhu7Ra15FJun2qt7swnEvYqMdU/WwMID+yfTbUHnmlyMCInPWlU1iCfcVgkZJ5N9bpnErQVOtOcUgBRJ5tpMbF2M6dQBElKcMrKFho7KEWwRihPW7GK1wYQGKkHMJsmHZNuFAeYoIp3XEuomLjVZCbN4JUF4h2Cw6jARbgZC+Ty4SLbLYZQ5X3qD3FZkRVPwksIPxyd+10HnZ+kr1/4zrPsHepVqzm6RL+vEv0m2GaOmxbaHEaiKiHBljfm+RWVYmavX/0PITyVl6ciSFqAWUdvYpRFky5uEuAn9/IGJMQKmPs8bmBM+60caqiTT39130nRqqm1r0y6zrLJYB8OqNasasgYEK4y2o9GcVO0kc/Q3rAQGrsT8A6T0cpB63gV2C53rXISIP0y7qdAUE7yjVIL6Bl/h+GQwKv4mqMcXCgySMGVrSES22bJ+W08p1mTOgjYVPEGqDnWhKgpLda5Y9gJB+WBWcwFJmq+WtIM2NTMYfzrNSPo9CFFTCWA613jIn73/2zgSyB/EhMFud5YIu0bsCMKAvwvtE/dbHP6Ev1PgN6kNj2toW4kPG1Bffr4nUWljaKb74o9XR6OOsWqsjrgPQ2V2JnZkNkCaEJK8/y6xQxa7pHpWf3gxSmk130/+1fiVlFFfJDTzjHWOPWd3QCJCxg3NxEbVbJXq2OMLbHR1CZznRg3Hf5hvPs1aVISAhuykGlFRAzT1rhGR2CFW9/iS73piez6jJgcVwyP6p4MpwQ9uRwhVxo8Ri1g9hkITh1x8ZIs2jE6ed8W2EEXQVF2ANDGgfuROl+QHROCRWXju3sTx+gGruZsCd/KukFIPK6I9M07mT9tpRJN2ETkKsyF1/HLX5QlW4wAsHBqXujbsbESVEUOoDP/OYDqPxMxINY0ZmOLXptwCJ+sAajq6mvWwa2cZ86u1qMvmm0aiuiGsDEpHezuHVn6aTPJxcKknbW3j0KTXFCF6Qzm0hgUCYnEJz4mo55SKSColOo5NQdLIYvnaHFP/dlPCMtxoyH8RmEJ1HndqLkNt2mLFOPmuuVgv6sHo8pNnsOtobtIbBCPDFaWfGm/JkBx3Y3c4YZgl1TWCNeNnoZB0u7SKoTRbTUbX+m3O75WfjBActQ3tkCZjTok3oAqP7+ZRgzx3gWed3nyG+eI8cOhgggGf8aIW12c8yfKNLmqc1BN240sCJT0+zJ2nh4uFiTMU5z3t31vT5P4He2PuwBG07NfEMSsm3nql1SVGX11k58MJ3JRVTfrcDRh7MM0nojk7ZYf+WNM52S/7H/jpFzm0o0R0oCyds3C9DbH8XaidHBPKuwUoK+Sdn8TufYKchfxEINjbqGnXF0TbRoBfNBWyOwHb/g5m5LwNlWxBuV94Mx50L+7WOxYELT4qoKOb71I6MaTN4KIZG0gOomQHpzxriza26SJczaUarOJmu+9psNPd23v57rKu4fFhk8Chce/9DFxCUpTIjmIcHdk/c71ebi3opsTqJgDAUUw8nQZTEf3Moy+MYHbMIGzBgkqhkiG9w0BCRQxgaUegaIAUwBvAGYAdAB3AGEAcgBlACAAUwBlAGMAdQByAGkAdAB5ACAARABlAHYAaQBjAGUAOgAyADUAMQA0ADkAOAA4ADQATQAgAE0AQQBSAEkAQQAgAFAASQBMAEEAUgAgAEoAQQBSAE4ARQAgACgAUgA6ACAAQgA2ADMAMQAyADYAMQA2ADMAKQAnAHMAIABGAE4ATQBUAC0AUgBDAE0AIABJAEQwIwYJKoZIhvcNAQkVMRYEFBWTvYphIpcMC6a1ZVNs8oUrBdX/AAAAAAAAMIAGCSqGSIb3DQEHBqCAMIACAQAwgAYJKoZIhvcNAQcBMCQGCiqGSIb3DQEMAQYwFgQQewKctIuDSoOk/r9Xc46zHgICB9CggASCFuhfSy2D5+0S2UnPRdOSpKJjsnoqMwgSVtuMWGqWf8jTQ50wpITQO0q++j880t8i7e66wOsy0nmTragntBckYXDyhHVwpSlo3I0fJblkL/YXBpmAbm+X9/IgJRhntlmI/zhjeuBaAs4Yhf2qpEPt2mJ13tXDRx0jFZUQRzfbtGoTAMySTkuWEgPVP1VO7kOpswQIeT7kMIW97E9EF1SIeDuZF4Ac/shS4wFShk23EL8J3SVTrXJPaOdi5xfRt6nslccyLPvDF9/l/6hsWbK5An+A/f3yVPqLvYtLYjkHuQuL2hAAyPQde/arS3tR1a8u8BZTbKvKS1EZkkK2SnwWTcfBlKKcYyvCiIn8pxGIlzOW4c1DYTRRxMd8Tpo+T8KtacQgwCb/gKGe9EZf25BIFZRORDgT+H1DFNRZ0FozU7+TDA+lGYlxt1PB0HFCPqZgzc221wQutTYQnx0baLfZk6tyoQr0B60SwHdENbNH9gyQZTwgNcCe8iEAkB5juqqtdZv62mI6KoY2bfD0lB3X1SCft2uxn8eZWRnI0S+r3yecIvNL52vuZ5EkigfdcVBGAdKb8nVfXR2m4TTd2xNyGGbNeQT6RJFdQKauWFBFV5F5sgE5PGg9ACYZYQzvs7g2JOSZP5JJynMn1a1QoQAdguuvQMkGNzzL4wZxletSxtYhS/pYUwVwWdAboYe8/GbM9ETtCRMgBq6V2yuGzQDAdirzxODGE5d6DwPzLrJv9RLZ982S5UGRoHgx3hOY0NY8FNjUnJPQ/2cJL6dgj7zS8X86G47tZr3QtPKVRG25B4terUfD/zWdgqk68q/PHumXB2FeHP/elSqzVkjZv+ukWtCwHApvdDVAd+W2vSMJD887E0J5YC748n8gRhVlCJzkyTzm0FRqBr6AYiL41NswWkzvzMm7hejbChKY8Flawck0zTo7ROgoAKuI6GSlCyW7NEOJBtQkBuS38EMp8QgrchAgp/1yOA6SgXi0srAj1IsdUlwjTtbpB8U9tpiEumb8YKk98V1zh48rwaFBuplj28mN4lRu3hq0IausUp7IcjbOERpNMwS7pSilOre/5g4nbCW53wCzQv+CSgC+4sqUoLRqQdPHkIYd61uo6iqXyYbZC+t7bb3Caw51VxTCDPDoY+NJE/5CbatZTDiijF4ViSyuYp4ByVYF8jr36QzmxETIYEumoDHHz1GoHZiU2ntNoigBFDGEqHKePDnra8MpUlqveTZ2OckAMA7Z1s/L6/pfLCeoabH/ZACEUWJ9TysjzJ85i5NaYodY4FOWkUMVX8M2UShPLkGyk6KHeoYIQVilkVCi2GH4bfX06I0mmVhuYAnktLgqoyKo7NRJMwkk3hZsXMNPfxBPh4F0dUvRwgg0zFcdIAmqtBCcTlQwL5nDRHff7u2Y3vZWuCRsXXCex6jYeEWNBTZDPgmOvYwGWTiGk9uHjtgukCDGqry5nJ9QmInkbluwr/OFUnY1BPawJ1wNbXmZQ9kCnOFZxzoERXrmNIgSJeAvamMCD6lfwCu+Xd06P5D8guW0skn/oKtaaTjvU1lvE08QvSn9hIeZM+kHkbk6wDEdN1+N+iX4gUVZSNhV2KtH8nVasB2jmaUCeZu5O0VpiOkTD3aa4wqiy5+sIZWmLpqvISOOrhSeulCIf2hLS5uZaRTxeVxj7vAB5G+A7U8SKNhSDTSy/q3SeY6qW8dUL7efkTimcBs0i7cvlBhAxLmf0HnXq8lvwqAi6qQMESsxsKnjftDtXUCR8CfilV3fedXaAC+Eq4ZfReBJ1bkIoEwFcWWvtSuHBrg+pm/g9InvTUI0+/xqrYhuasSbHQfdlGPQ9MpiKGyZuC+gqV6JVa3ODWTPBQZPX0amkDivRfAvZfZ2X6Rd5NJQPTQL5lM91W3Q8xNw9NMDVDKpzYdHjlltnyuOai00FcbH/JX7CWbbrIvHfYmjb1Y0NSHVb/jDgpHyrJPokVyc9T/bjxnAmIh3o2g4qA8V+9Q1v8+fhlhAegQtlq4BB+3TifVsLC/kqr3Exoc9wGskArEF41sYQdhV8OkIZUOsGHiLHzMnsp6aJnUW7YGHWuAl3QDfW7BI+op6Z7Su8LCDfujupjaiNSft/EWw5WgQ5Wn+TCmO4/NBybDij2wDrfWzfi8a2uHx1rvaYq4JjC/BZSzCf17leFz2BsMz/o6JfeIg6/ZGmAQCgMiGQmyN3r3c1P28ssDGvYRyrfvb51UQB7Kxp36SGo7B5ubqKIe8ay4OVAA3N6jYStpJJlL6RkW9WgbxtRzIxoskRUZQ0+lvO7gXy093AKfDiT+LHnQJ5Xb/BnxmMRoSHjnHEQl3HU4ZPPaRN2HdFcgQ+sUPZpMwJ1m7h99yBEYsl7r7MiEPDmoV1v1mLe15/8eMUyMPbCFsJkp3bWRWUfx79BonHv9M+W4qJZyxuMVss4d1c15E2xMAt50VxahRQyqkk8mnpFAJ/stWkk7NjKkYDTsjbQ4n7rhTkO+FOf2vyLMUgWj7lDJVe+cNTOAF6qxyvh0vcXK5nmBEFUCcaZ1CFshwDjVnSHSiTjkNiSZi/ZgG0WedxMZGCo63HRi7R7yBUdwi3uIp5IxBp4YU9xkSckf9JQCJumcOofNk9WujfjyBiDeAFxMdDNdz1dKdCNN2PZqIaZOoXEtK0KH6HV9YdgPClYvs2/YwTKw+4H4ryhcMMDtVPt3XnGcf9Hi4wASl6Jnd6JwltdFIN/N7ENfHChDYrtDok02osIyB0B1eJtqiswDCXLD+s01uQTfXohym73P6cARN5xgwmdYDPa00H+XGb4G1XtsVymgKbA5mEY4+wGqyUFnrMM4H5kdBEIkp+H2CHSCukY8o1A67HTMlhaFbvqG2NE0BdpcEMPEauSGvU01VY0eA841dCFDVImusSmB/7yMCNpfA5LlIBoy3W9JOPw5bADYhOZhfZSEe/O5WSeZDE8csWVU3IhwzVElpFX47vLSgIl9n2T3RARoeTYLg6aJIbEcBvSITpQhAsyYYMnwJ+joiiyvgny8dhKWfjT2h3nY/wLcobR73mgkim/NI0L8tHvdNi8FSLgonXV3BmIJGBXF4F+6SrWGVwrv9WqlKpSXomVp1NU7Rb8ZDLfy/dzz38sCLBUtjPWhZBmWkplAuXypxSOqRns+GJOqZISptHZ2ryS7Eh5sa2ze4l93GQNyF6JgQDUUc1lNyKz8GRv67GeChMK4KrD7VDbNop1nZ9vsB63wLF1lNLBYQOqDHgUcNZBrFuOcSx95ugCpOmP17RbkhF6PbYbGmE2JbzqL6Tdcp0k39MAUoFecBECoZTYxXQ669tovc3Yxx6AfSLOxYFvDp0+21s+6OdzLRBVZEawIR34Tqn38VKKcSqeVwbTzE36CxVeVfmT9Zj33cdbrrY8eT10XoyYFpvYWlM7nH54CAdvg54OWTef9vjywdscAfnn3hU5WFmLuGJ0uNewyJkXkCcDa0M/xWd290UKUrJO7GBibDln+A+gLexcha5TpKh2h795QQ6G2gNWppCjzc+weArmoyEMh4ILudjh+HLIccZJNQBtfa/Ari9iMFLRj+L3AIh99f42qi9v4fzwhKpDCH9Vy5yakdh7Wo5Vw+Xpte4O6Gqk49kOdRJDBQ6D60unv0B6JtjLVgzoZOfF6szrEi4CtHf1D08LOZwpngljDHgahCC44RrnMRp4AhVZKirR2d+eyQWWzbgDApjPvRSrdp7rdxBaF1ZJecnG9/hyoQYYfb1C5KfH2dqhrri5E9asvDM6rvzxKQodbbv6C5N8U2G6RpqaDCKOQXxyHN1kYHX7PEnbTMgGL1AKn8BNkalHR/YFB87lv58AV3w/mnIWSPmrkJAM6Vc4lWKva06dWNFhOZ43EsLFeTYCVGUwxbnXdQn8JKIp3pPW3nrohUCNM7CDYH4NOCNhkRjIrYS98vttYkyDHkgRhJ6/DnsrmyqOk+yaptl1Eu1Gk+4+qZWvjvD1rBe1YRYz82p7cORyIaML0f654X+PuhdzrmYngxHZbv905w7u/ZWqJynySs6yb18Wv7o5mFxbLScx7vBuDii/T5ztUQSJxPo2nefl66CWZ0k2oyPmmS14/fMdzd6OQ1RjL1tL79myl6NVTGsn0BuBz16sPhRWejEKhdLdbPs9qJB6mfx/Ec7o+HWkyLkaaOvtyq8axXDiet0YI3EreuxR/eV94l3USoSeCUy4FBetXkfsH+uIQAfWXR5yov4mTR1Kh3noXVkTQfjKuz1q+K+CXuk4h6GqrmJIYIoG08ro/81NsU19mfWDJL1/kM1Pph41zQznocW2crUtKt55VIIbGppj49S510YOXFhAdbA3YpIJvNa9+mMtkYW5Wp9ciAzGj/ldNQZ55MqRlWYZGNJTkDGCbwNNUHY6a5wiX56W7dR7RKf9MiJBIk7c1nPizcFt4KLOwYgwW0G5rEC5GJUsPt934NjcJcgP07e2BQfk/cso1ndA9GT9MwYHlDeytGmUyTqYxrLvNR1XpiqzpetbhHekl/+Yw8rpM8QpZc2SXzpzE4i0xsYXl6oW49c1F4zQoINSk0nMflJwB9m50mJMGqh7UJ4mrdMs8McUaQKhWiRCIk97mmMiyOqVw9nBK0CMU/SiA+hcDULsr9CvfOJN5ZVSF8y4kf0NtHpjcdWpwIT4Ty48wsdK4KPxo9dkAgdRkDMCBSSibohiqCMMLLaqWdsuh4SmgePLVeQ6/uIDYcC3D8kJCOiXC0JI7Mho0ajqjgz1ZZiElDdLUBtGp5yDeueMR4yVfCXzFDaxhiahqylBDpy3589pc4E6PdIX6SIUa9UT319zBLg2bVJEsyNtMLX+4iGSdCT+gUCGifKLXzU44zNwDe9br4D9+gbwbxsxlrWVRK64VBzKJLdjY/DUluru5eA2d7C9mSWv6YgEtlPifCUPF3QHwCn1sHcc2AD4wuAfWo0na4/ZuIYq0Og2aBEfSH78mMA1EOa2wlG/IfzLqKFXantGGnHGEPjrjiNFEapxYvX0XhuiDePHVeRvkvOSqlNTdNJTgsHay6udc2pFQmoTabyUBaKG0yXcSp94SIJFTXf44K80ckopuxRokfkfWBUivQtACG7I5O+EOMFcfiNQb4GREWN2HCWI8WTbzcUXjYUKGeZ8dfigaVJB1n3K3ENk7lMfTN3Tm/SP0LTtha2+9/OF1OkbbbmHrHLEbvuPwvWcZEYOmbxS3mBmXg7Dbr8fL0tCs5A8ZA/MTzKTQVXObnxb30Bv/63isxhf3fegapifv5YTQGNMsNfKt5CMA60FeAA6xdKhm7CT1v+5L4prxiadGEIz7+fzZK5ka4+lntzCnCeOAo/pI7kPF/wAmCbQZA0BHHp7To6E9dcsJO2vbJULV3hVLy+iCiLdhraMcBJbjaGpUXEUQC9ChNzUsqYTIotmM0pRAvqiPbhP3waRemNa8o/7HiuMMsO8ORVerGv6I6pjAHi/vr/27DS2NTzVo/VcUkk6DoY42ZFXz/yDLEOZMsUwO1CH25YLwWevLNKI76tv7UkfHw+RmXNuvVe48/WgiIYh4d8JVN2hfofUSg0bkjKidsCude4Xk1VM91NoC1HoHqx5lHiJEl8FaLfa42B/SjOA5u4DZjwBIpxtutBXOZ9BKXvi+gRO0BselJBaPXdGe+vu7/DT6d18QbstKHJhOIY0WLB2Az1M+sc7ZKjOfmd/YMTbhZhp07FGE9KLpHQgG7BHdPCWCzDLVf5YIjLBRnIUvFuo2GmH6X9meLE0P0FGO40TP/4qSJoz7DTtsWSZXKsyaY6ef+sudQOZjxf66Z3L9ThBYmusRG9HKd2uDpb5tYSsTNOE+fZsT/66vCOnRdk4II0/pY0Aahgw1DjTOHtNdyg+3tdF/nK2AamUej/8lMx71CTOD+wZq8Guo6VZ41KkO2ck1RbUD7tQnzV3mLBpgH5vagW7I/Tx2ZBpTXAAYb6YmYajtC0t3EeDj8zY+RVcZaQsyYYOGm6Dno2zzBPvjNgnaW9VZFhktllzj+XNR308My7D43rFrHJ6RHkvIHlHUZXn0F8VcccKgM1vsMPFFR76dcwyOTKyzQw6YtvmUTfMzhPzYjeq6hVXYuJ5G1NKCXxeVGhJhlodEqgtZM3WLOEbAShjuacMq2Jv0/3G1GzJpHR4Yvimw9p29YIiwQwW6zNP/mbUKvQmr4tPxHpcujxjgL6GTBrtKaSnNWKRCUTw74zcC1JCkTvNvDDGMoFJPkTRCWul98qsntp8RVkZGKDdPqQD2pTj7exF/27O6TV+2i7Gbo5XCwwtHYctVGR5ZZ8J+dEpf6nd5oieWSkqx828oteVFa0luvLz4KMztxndo3Ymc4QniDSL6RPwyt60s+zXhAoazE7gPR8Bzfi5HZh8SFg7UpL2lBMsU2oibcv+qvK7jjBci8tWvOOY3RKum/8b+22jrTwAywqeqXyIaKamvq5JMl/vRrlYvkiqvTg4L25d2UPEJrF5i4ooSduRy4A4eUWqIKq0VQu2sETlyw4cPlSurxGI17BJv4A+xnRxEj23RBxNI3BDgF/kVmxo0A7blT13kBc+MhaQpBuPiDXKMdJRqIYsBVaRExn+zjYrYwYWgwKEeo134/xhIHy8dPFMlhMUGMOzD7P0RZdPhVsb2zIPzBwcuV+U1I3ZLKDcg7Z6Ek2wKT8HCG/GvHX+DArdA0IDc+Zjwebs5iREuG2JsFLmTxsYR4U0sX+CoXsRleecn6Bl9ZGzLJnRhCpbcXzhB4hYTEVmLu2SDNBSKGSlr9XRtYw376GIap0oR3IFLHhfrqqas3MJD4WQPkjlgjpRC7PkTTAYKPrbGJtV//h+phLckschHiK8EkUxZDg2bQRh9IQTR8O4riWg81ziDb3gvu4yu7uBmocA+Z6MSG+24cDzVAp82/nColJGHfWlrwER/Qny7mAzFYFWJDNdcQuR9f95zHbpvr3Arz/zixNtC1ZwMk3/F0Pv9I5zDD5rnxO0KskhR9AxpPjAOl62ZIC4FbSZ8KTUJ17wcT+g8+BCCkB11ZoTKHRmKLr9YuQIDIkxtgrh5EXooFfFqw8IYSrnKBa/k2jfmYkk2PvcDOp/ngupyVBhwsLBEDogoMvDDbn6ySre4YvPX6SUHbIayhu1uchXQ1fzyco/kRTBUS2zkTSYU6kHHOSWPvmk/mGa5dx53piw3mhO8PnXBjmFECsGnbiikxSYXtDQDf/V44HCO5AciMvk9UvPwfgCYWm+jIaQTZWEldgGnG82aN5b4kWLAYYfyHac84aQfO++fHrSK/XsacLGEhrk82G6lSI+zNio4oC8QNG3QeYsww/i64UAEE/p/5WljbP3L6WTXG0fEAWonp59hDwVQrB8srwNf3PTtmB8//QMaBMIqdp2nGWbRPCnz3Jk+d3Upsze3ZFUWJ0QMwtMknQNMT7mmJzlVpLCqwsg4UU0THjMI99Y/QMF9MkP4bOAS2EfdP332BxMxHQeuhsWhPMi+f7JzD2mXJ5uLn69FkhCqXOLYghamGeslucSMQJZbGt4ILhTd3vBO5MYRoWmDTEwl3jourNCsNB3IPdUcK2spXm9hWVXi5CWaPx7xI24buP9uCS96DOO2qTNm3aVm3eeyPbT0tb6AfrbAdujHXnUfdhZChJv2ySHsklAVeXFyUsfRb04rABOCdkbNLQ9z2F2GI7bVEYJgh+SmFx3HoJNIKdlzPdU+nLKksJXO7Fc6TZOMCg2U6L4wpjftJ/cCL2Rca5tLyW3j75pxifoPkdjETkTL77c+t1ch7BHObY6AerEzZ8cc8x5IQC/oTZe7MsXRXsQQIO2S2zb8Rk2gAAAAAAAAAAAAAAAAAAAAAAAAwOTAhMAkGBSsOAwIaBQAEFF6dbMEVjw8HmT2maU31IP0ey8HQBBC7vZJlLbE2Z6x9ZJqDEWpFAgIH0AAA')); var soap = new Ax.net.SOAPClient("https://www7.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP", options => { options.setSSLTrustAllFactory(true); options.setSSLClientKeyStore(ksc.toInputStream(), '0000', null); options.addRequestHeader("Connection", "close"); }); var response = soap.call(call => { call.setMethodName(null); call.setAction("SuministroLRFacturasEmitidas"); call.getEnvelope().declareNamespace("ns1", "https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroInformacion.xsd"); call.getEnvelope().declareNamespace("ns2", "https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/ConsultaLR.xsd"); call.setBody(xmlcmd); }); console.log(response); console.log("HTTP Status Code: " + response.getStatusCode()); if (response.getFaultCode() == null) { var xml = new Ax.xml.XMLElement(response.getValue()); var json = xml.toJSON(); if (json.jas("ns1:SuministroLRFacturasEmitidas")) { console.log(json.get("ns1:SuministroLRFacturasEmitidas")); } } else { console.log("SOAP Response Error Code: " + response.getFaultCode()); console.log("SOAP Response Error Msg.: " + response.getFaultString()); console.log("SOAP Response Fault Entries.:"); console.log(response.getFaultEntries()); console.log("SOAP Response Fault Details.:"); console.log(response.getDetailEntries()); } </script>
4 Client statistics
To inspect SOAP
client statistics simply call:
var ksc = new Ax.io.File('/tmp/test_sii_cert.pfx'); ksc.write(Ax.util.Base64.decode('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')); var soap = new Ax.net.SOAPClient("https://www7.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP", options => { options.setSSLTrustAllFactory(true); options.setSSLClientKeyStore(ksc.toInputStream(), '0000', null); }); console.log(soap.getClientStatistics());
+-----+----------+-----+-------------------------------------------------+--------+------+-------+------+-------+-------+--------+-----+--------+---+------+------+-----------+
SOAP client queue
+-----+----------+-----+-------------------------------------------------+--------+------+-------+------+-------+-------+--------+-----+--------+---+------+------+-----------+
|rowid|type |age |url |username|locked|succeed|errors|mintime|maxtime|meantime|type |is_valid|qop|snonce|cnonce|nonce_count|
|rowid|Type |Age |URL |Username|Locked|Total s|Total |Time mi|Time ma|Time mea|Auth |Valid |QOP|Nonce |Nonce |Nonce count|
| | | | | | |ucceed |errors|n |x |n | | | |server|client| |
+-----+----------+-----+-------------------------------------------------+--------+------+-------+------+-------+-------+--------+-----+--------+---+------+------+-----------+
|303 |JavaScript|995ms|[http://www.mydeister.com/soap/servlet/rpcrouter]|android |[ ] | 5.0| 0.0| 19ms| 556ms| 179ms|Basic|true | | | | |
+-----+----------+-----+-------------------------------------------------+--------+------+-------+------+-------+-------+--------+-----+--------+---+------+------+-----------+
5 Axional SOAP services
Axional Studio provides a wide range of web services grouped in various URN
- SOAPSQLServer, Database interface
- SOAPOBJServer, Application Objects
- SOAPAPPServer, Application Services
- SOAPSQCServer, Catalogued SQL services
- SOAPSQCServerV2, Catalogued SQL services (V2)
- SOAPXMLServer, XML services
5.1 SOAPXMLServer
Use can use SOAPXMLServer to execute xsql-scripts
The following example call the script cerrauth_autoriza. The script arguments are passed as an array
function main(data) { let userCode = Ax.ext.user.get().getCode(); let gcomfach = Ax.db.executeQuery(` SELECT wkfcab, errcab FROM gcomfach WHERE gcomfach.cabid = ${data.cabid} `).toOne(); let cwkfacci = Ax.db.executeQuery(` SELECT accid, flowini FROM cwkfacci WHERE tabori = 'gcomfach' AND flowini = ${gcomfach.wkfcab} AND cwkfacci_userauth(tabori, ${data.cabid}, flowini, flowfin, '${userCode}') = 1 `).toOne(); let mArrayParam = ["gcomfach", data.cabid, 0, gcomfach.errcab, cwkfacci.accid, cwkfacci.flowini, null, userCode]; var soap = new Ax.net.SOAPClient("http://xxx.xxx.xxx.xxx:8080/soap/servlet/rpcrouter", options => { options.setUser("YOUR_USER_NAME"); options.setPassword("xxxxxxx"); }); var response = soap.call("SOAPXMLServer", "executeXML", "YOUR_DATABASE", "cerrauth_autoriza", mArrayParam); if (response.getFaultCode() == null) { var xml = new Ax.xml.XMLElement(response.getValue()); var json = xml.toJSON(); } else { console.log("SOAP Response Error Code: " + response.getFaultCode()); console.log("SOAP Response Error Msg.: " + response.getFaultString()); console.log("SOAP Response Fault Entries.:"); console.log(response.getFaultEntries()); console.log("SOAP Response Fault Details.:"); console.log(response.getDetailEntries()); } }
5.2 SOAPSQLServer
You can use SOAPSQLServer endpoint to access a remote database over internet and perform SQL DML and DDL operations.
In the following examples we will use a remote database called test_data
and
an table named table_soap
. To run the examples, create the table in the
remote database.
CREATE TABLE IF NOT EXISTS table_soap ( c0 SERIAL NOT NULL, c1 CHAR(10), c2 INT NOT NULL, c3 INT8 NOT NULL, c4 FLOAT NOT NULL, c5 DECIMAL(12,4) NOT NULL, c6 DATE NOT NULL, c7 DATETIME HOUR TO SECOND NOT NULL, c8 DATETIME YEAR TO SECOND NOT NULL, c9 BLOB NOT NULL );
5.2.1 Query
To perform a query call the executeQuery
on desired database and send the
query string. The result will be a ResultSet.
<script> var soap = new Ax.net.SOAPClient("http://www.mydeister.com/soap/servlet/rpcrouter", options => { //options.setURL("http://localhost:8080/soap/servlet/rpcrouter"); options.setUser("deister_test_error"); options.setPassword("deister123"); }); soap.call("SOAPSQLServer", "executeQuery", "junit_studio", "SELECT * FROM systables WHERE tabid < 10"); </script>
+-----+----------+-------+
|tabid|tabname |nrows |
+-----+----------+-------+
| 1|systables |113.000|
| 2|syscolumns|786.000|
| 3|sysindices|150.000|
| 4|systabauth|111.000|
| 5|syscolauth| 54.000|
+-----+----------+-------+
5.2.2 Insert
You can insert into a table using a JSON object. The returned information is a SQLCA
object
containing:
- count: number of rows processed in remote database server
- serial: the last autoincrement (serial) value generated (if any)
- time: SQL operation time in milliseconds
- type: remote SQL operation type
- sql: remote SQL statement
<script> var soap = new Ax.net.SOAPClient("http://www.mydeister.com/soap/servlet/rpcrouter", options => { //options.setURL("http://localhost:8080/soap/servlet/rpcrouter"); options.setUser("deister_test_error"); options.setPassword("deister123"); }); Ax.db.execute('DROP TABLE IF EXISTS table_soap'); Ax.db.execute(`CREATE TABLE IF NOT EXISTS table_soap ( c0 SERIAL NOT NULL, c1 CHAR(10), c2 INT NOT NULL, c3 INT8 NOT NULL, c4 FLOAT NOT NULL, c5 DECIMAL(12,4) NOT NULL, c6 DATE NOT NULL, c7 DATETIME HOUR TO SECOND NOT NULL, c8 DATETIME YEAR TO SECOND NOT NULL, c9 BLOB NOT NULL );`); var file = new Ax.io.File("/tmp/sample.txt"); file.write("This is a text file to serve as BLOB"); var row1 = { "c1": "abc", "c2" : 123, "c3" : 1234567890000123, "c4" : 156.90, "c5" : 156.9123, "c6" : new Date(), "c7" : new Date(), "c8" : new Date(), // You can upload binary data into BLOB data type by using a File reference "c9" : file.toBlob().getBytes() }; var response = soap.call("SOAPSQLServer", "executeInsert", "junit_studio", "table_soap", row1); console.log(response); Ax.db.execute('DROP TABLE table_soap'); </script>
{serial=1, count=1, time=3, type=INSERT, sql=INSERT INTO table_soap (c1,c2,c3,c4,c5,c6,c7,c8,c9) VALUES (?,?,?,?,?,?,?,?,?)}
Reading data
Let's see now how to read data we have just inserted back.
<script> var soap = new Ax.net.SOAPClient("http://www.mydeister.com/soap/servlet/rpcrouter", options => { //options.setURL("http://localhost:8080/soap/servlet/rpcrouter"); options.setUser("deister_test_error"); options.setPassword("deister123"); }); Ax.db.execute('DROP TABLE IF EXISTS table_soap'); Ax.db.execute(`CREATE TABLE IF NOT EXISTS table_soap ( c0 SERIAL NOT NULL, c1 CHAR(10), c2 INT NOT NULL, c3 INT8 NOT NULL, c4 FLOAT NOT NULL, c5 DECIMAL(12,4) NOT NULL, c6 DATE NOT NULL, c7 DATETIME HOUR TO SECOND NOT NULL, c8 DATETIME YEAR TO SECOND NOT NULL, c9 BLOB NOT NULL );`); var file = new Ax.io.File("/tmp/sample.txt"); file.write("This is a text file to serve as BLOB"); var row1 = { "c1": "abc", "c2" : 123, "c3" : 1234567890000123, "c4" : 156.90, "c5" : 156.9123, "c6" : new Date(), "c7" : new Date(), "c8" : new Date(), // You can upload binary data into BLOB data type by using a File reference "c9" : file.toBlob().getBytes() }; var response = soap.call("SOAPSQLServer", "executeInsert", "junit_studio", "table_soap", row1); console.log(response); var row2 = soap.call("SOAPSQLServer", "executeQuery", "junit_studio", "SELECT * from table_soap WHERE c0 = " + sqlca.getSerial()).toOne(); console.log(row2); Write blob (bytes) to file var file2 = new Ax.io.File("/tmp/sample2.txt"); file2.write(row2.c9); Ax.db.execute('DROP TABLE table_soap'); </script>
{c3=1234567890000123, c4=156.9000, c5=156.9123, c6=2019-02-22, c7=11:13:11, c8=2019-02-22 11:13:11.0, c9=[B@26b95b0b, c0=1, c1=abc, c2=123}
5.2.3 Update
Let's now update previous inserted row. As we know serial returned is 1 we can us it as primary key.
<script> var soap = new Ax.net.SOAPClient("http://www.mydeister.com/soap/servlet/rpcrouter", options => { //options.setURL("http://localhost:8080/soap/servlet/rpcrouter"); options.setUser("deister_test_error"); options.setPassword("deister123"); }); Ax.db.execute('DROP TABLE IF EXISTS table_soap'); Ax.db.execute(`CREATE TABLE IF NOT EXISTS table_soap ( c0 SERIAL NOT NULL, c1 CHAR(10), c2 INT NOT NULL, c3 INT8 NOT NULL, c4 FLOAT NOT NULL, c5 DECIMAL(12,4) NOT NULL, c6 DATE NOT NULL, c7 DATETIME HOUR TO SECOND NOT NULL, c8 DATETIME YEAR TO SECOND NOT NULL, c9 BLOB NOT NULL );`); var file = new Ax.io.File("/tmp/sample.txt"); file.write("This is a text file to serve as BLOB"); var row1 = { "c1": "abc", "c2" : 123, "c3" : 1234567890000123, "c4" : 156.90, "c5" : 156.9123, "c6" : new Date(), "c7" : new Date(), "c8" : new Date(), // You can upload binary data into BLOB data type by using a File reference "c9" : file.toBlob().getBytes() }; var response = soap.call("SOAPSQLServer", "executeInsert", "junit_studio", "table_soap", row1); console.log(response); var row = { "c1": "ABC", "c2": "456", }; var key = { "c0": 1, }; console.log(soap.call("SOAPSQLServer", "executeUpdate", "junit_studio", "table_soap", row, key)); Ax.db.execute('DROP TABLE table_soap'); </script>
{serial=0, count=0, time=0, type=UPDATE, sql=UPDATE table_soap SET c1 = ?,c2 = ? WHERE c0 = ?}
Notice update operation returns an SQLCA
with number of rows updated in count
variable.
5.2.4 Delete
The delete operation requires a JSON object with keys for delete condition.
<script> var soap = new Ax.net.SOAPClient("http://www.mydeister.com/soap/servlet/rpcrouter", options => { //options.setURL("http://localhost:8080/soap/servlet/rpcrouter"); options.setUser("deister_test_error"); options.setPassword("deister123"); }); Ax.db.execute('DROP TABLE IF EXISTS table_soap'); Ax.db.execute(`CREATE TABLE IF NOT EXISTS table_soap ( c0 SERIAL NOT NULL, c1 CHAR(10), c2 INT NOT NULL, c3 INT8 NOT NULL, c4 FLOAT NOT NULL, c5 DECIMAL(12,4) NOT NULL, c6 DATE NOT NULL, c7 DATETIME HOUR TO SECOND NOT NULL, c8 DATETIME YEAR TO SECOND NOT NULL, c9 BLOB NOT NULL );`); var file = new Ax.io.File("/tmp/sample.txt"); file.write("This is a text file to serve as BLOB"); var row1 = { "c1": "abc", "c2" : 123, "c3" : 1234567890000123, "c4" : 156.90, "c5" : 156.9123, "c6" : new Date(), "c7" : new Date(), "c8" : new Date(), // You can upload binary data into BLOB data type by using a File reference "c9" : file.toBlob().getBytes() }; var response = soap.call("SOAPSQLServer", "executeInsert", "junit_studio", "table_soap", row1); console.log(response); var key = { "c0": 1, }; console.log(soap.call("SOAPSQLServer", "executeDelete", "junit_studio", "table_soap", key)); Ax.db.execute('DROP TABLE table_soap'); </script>
{serial=0, count=0, time=1, type=DELETE, sql=DELETE FROM table_soap WHERE c0 = ?}
5.2.5 submitSQL
submitSQL can be used to perform asynchronous (non blocking) database operations. Operation returns the task ID (int) in the queue.
<script> var soap = new Ax.net.SOAPClient("http://www.mydeister.com/soap/servlet/rpcrouter", options => { //options.setURL("http://localhost:8080/soap/servlet/rpcrouter"); options.setUser("deister_test_error"); options.setPassword("deister123"); }); Ax.db.execute('DROP TABLE IF EXISTS table_soap'); Ax.db.execute(`CREATE TABLE IF NOT EXISTS table_soap ( c0 SERIAL NOT NULL, c1 CHAR(10), c2 INT NOT NULL, c3 INT8 NOT NULL, c4 FLOAT NOT NULL, c5 DECIMAL(12,4) NOT NULL, c6 DATE NOT NULL, c7 DATETIME HOUR TO SECOND NOT NULL, c8 DATETIME YEAR TO SECOND NOT NULL, c9 BLOB NOT NULL );`); console.log(soap.call("SOAPSQLServer", "submitSQL", "junit_studio", "INSERT INTO table VALUES(1, 2)", "task name")); Ax.db.execute('DROP TABLE table_soap'); </script>
567