2012-11-28 2 views
12

Mi chiedo se esiste un modo per convertire una stringa in SOAPMessage?Come convertire una stringa in un SOAPMessage in Java?

Lasciatemi dire che ho una stringa come segue:

String send = "<soap:Envelope xmlns:mrns0=\"http://sdp.SOMETHING.com/mapping/TSO\" xmlns:sdp=\"http://sdp.SOMETHING.com.tr/mapping/generated\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">" 
     + "<soap:Header>" 
     + "<sdp:token>" 
     + "<sdp:sessionId>" + sessionId + "</sdp:sessionId>" 
     + "</sdp:token>" 
     + "<sdp:transaction-list>" 
     + "<sdp:transaction-id>" + 11 + "</sdp:transaction-id>" 
     + "</sdp:transaction-list>" 
     + "</soap:Header>" 
     + "<soap:Body>" 
     + "<sdp:SendSMSInput>" 
     + "<sdp:EXPIRY_DATE>" + extime + "</sdp:EXPIRY_DATE>" 
     + "<sdp:MESSAGE_CLASS>0</sdp:MESSAGE_CLASS>" 
     + "<sdp:S_DATE>" + time + "</sdp:S_DATE>" 
     + "<sdp:SHORT_NUMBER>1905</sdp:SHORT_NUMBER>" 
     + "<sdp:SRC_MSISDN>" + numSend + "</sdp:SRC_MSISDN>" 
     + "<sdp:TO_RECEIVERS>" 
     + "<sdp:msisdn>" + numSend + "</sdp:msisdn>" 
     + "</sdp:TO_RECEIVERS>" 
     + "<sdp:MESSAGE_BODY>" 
     + "<sdp:message>Message body here.</sdp:message>" 
     + "</sdp:MESSAGE_BODY>" 
     + "</sdp:SendSMSInput>" 
     + "</soap:Body>" 
     + "</soap:Envelope>"; 


Quando faccio questo:

SOAPConnectionFactory sfc = SOAPConnectionFactory.newInstance(); 
    SOAPConnection connection = sfc.createConnection(); 
    InputStream is = new ByteArrayInputStream(send.getBytes()); 
    SOAPMessage request = MessageFactory.newInstance().createMessage(null, is); 
    request.removeAllAttachments(); 

    SOAPPart part = request.getSOAPPart(); 
    part.detachNode(); 
    SOAPEnvelope env = part.getEnvelope(); 
    env.detachNode(); 
    SOAPBody body = env.getBody(); 
    body.detachNode(); 
    SOAPHeader head = env.getHeader(); 
    head.detachNode(); 

    request.writeTo(System.out); 

    URL endpoint = new URL("http://sdp.somewhere.com.tr/view/LbsOpaqueService.wsdl"); 
    SOAPMessage response = connection.call(request, endpoint); 
    System.out.println(response.getContentDescription()); 

tutto funziona bene. Ma ottengo ancora NULL dal server. Quale potrebbe essere la ragione? Ho modificato < e> per sfuggire ai caratteri.

+1

Si potrebbe analizzarlo. O costruiscilo come messaggio in primo luogo. –

risposta

26

Convertire la stringa in un flusso di input, quindi leggerla nella fabbrica di messaggi SOAP.

InputStream is = new ByteArrayInputStream(send.getBytes()); 
SOAPMessage request = MessageFactory.newInstance().createMessage(null, is); 

You can read about how to do this here.

+0

Grazie mille. Un'altra domanda: quando creo SOAPMessageRequest, creerà automaticamente intestazione e corpo. Devo cambiare parte della mia stringa? –

+0

Già fatto, signore! Ma sono confuso su quale parte rimuovere. –

2

questo funziona per me:

SOAPMessage sm = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL).createMessage(new MimeHeaders(), is); 
+1

Ho provato per tre giorni, provando ogni possibile combinazione, provando a eseguire il debug di ogni byte. E sempre ricevendo l'errore "eccezione puntatore null" Infine ho provato il tuo suggerimento, e ha funzionato –

0

Invece di:

System.out.println(response.getContentDescription()); 

Sostituirlo con seguente riga dopo aver ricevuto la risposta:

response.writeTo(System.out); 
0

In questo modo si può leggere da un file:

byte[] encoded = Files.readAllBytes(Paths.get("C:/resources/soap/RequestFileReply.xml")); 
InputStream bStream = new ByteArrayInputStream(encoded); 
SOAPMessage request = MessageFactory.newInstance().createMessage(null, bStream); 
SOAPBody body = request.getSOAPBody();