Mon client SOAP beaucoup trop lent
Bonjour à tous,
Dans le cadre de mon travail, je dois convertir en Java un fichier Excel VBA qui envoie des données via un client SOAP avec des XML vers un serveur (qui n'a pas été développé par ma boîte et donc inaccessible à toute modif).
J'ai donc cherché un client Soap en Java corespondant à mes besoins, qui envoie des Xml basées sur des services et méthodes. J'ai trouvé et implémenté, ça marche bien mais le problème c'est que c'est beaucoup trop lent, inutilisable professionnelement. Alors que le client Soap de VBA du fichier Excel est ultra rapide.
J'aimerai donc savoir pourquoi mon client Soap est si lent et comment y remédier. peut-être un meilleur client Soap mieux codé ?
Je vous joint mon Soap ci-dessous. Merci d'avance.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
| public class SoapHelper {
// connection properties
public String server = "";
public String username = "";
public String password = "";
public String session = ""; // this is the session id returned by the server upon successful login
// API
public String service = "";
public String method = "";
public StringBuffer request = new StringBuffer(); // this is what we send to the server
public String response = ""; // this is what the server return to us
public SoapHelper(String server) {
this.server = server;
}
private String getURI() {
return "https://" + this.server + this.session;
}
private SOAPMessage makeMessage(String nodeName, String xmlStr, boolean asResponse) throws Exception {
MessageFactory msgFactory = MessageFactory.newInstance();
SOAPMessage message = msgFactory.createMessage();
SOAPPart part = message.getSOAPPart();
SOAPEnvelope envelope = part.getEnvelope();
envelope.addNamespaceDeclaration("xsi", "http://www.w3.org/1999/XMLSchema-instance");
envelope.addNamespaceDeclaration("xsd", "http://www.w3.org/1999/XMLSchema");
SOAPBody body = envelope.getBody();
SOAPElement element = body.addChildElement(envelope.createName("ns1:" + this.method + (asResponse ? "Response" : "")));
element.addAttribute(envelope.createName("xmlns:ns1"), "urn:" + this.service);
element.addAttribute(envelope.createName("ns1"), "http://schemas.xmlsoap.org/soap/encoding");
SOAPElement ele2 = element.addChildElement(envelope.createName(nodeName));
ele2.addAttribute(envelope.createName("xsi:type"), "xsd:string");
ele2.addTextNode(xmlStr);
if (!asResponse) message.saveChanges();
return message;
}
public void doRequest(String service, String method, String xml)
{
this.service = service;
this.method = method;
request.setLength(0); // clear the buffer
request.append(xml);
try
{
sendRequest();
}
catch (Exception e)
{
e.printStackTrace();
}
}
private boolean sendRequest() throws Exception {
try {
SOAPConnectionFactory conFactory = SOAPConnectionFactory.newInstance();
SOAPConnection con = conFactory.createConnection();
URL endpoint = new URL(this.getURI());
SOAPMessage message = this.makeMessage("msgstr", this.request.toString(), false);
SOAPMessage retval = con.call(message, endpoint);
//extraction du XML en String lisible du message SOAP
this.response = extractXML(retval);
} catch (Exception e) {
this.response = e.getMessage();
}
return true;
}
private String extractXML(SOAPMessage message) throws Exception {
SOAPPart part = message.getSOAPPart();
SOAPEnvelope env = part.getEnvelope();
SOAPElement element = null;
SOAPBody body = env.getBody();
String returnxml = null;
if (body.hasFault()) {
throw new Exception(body.getFault().getFaultString());
} else {
Iterator iter = body.getChildElements();
while (iter.hasNext()) {
element = (SOAPElement) iter.next();
Name name = element.getElementName();
if (name.getQualifiedName().startsWith("ns1")) { // e.g ns1:Authenticate
break;
}
}
iter = element.getChildElements(env.createName("return"));
while (iter.hasNext()) {
element = (SOAPElement) iter.next();
returnxml = element.getValue();
break;
}
}
return returnxml;
} |