2017-03-29 3 views
1

Ich habe mit wsimport einige JAX-WS-Artefakte erstellt. Hier ist der Befehl wsimport, den ich verwendet habe.SOAP mit JAX-WS und WS-Adressierung konsumieren

wsimport -b "C:\temp\Customization.xml" -B-XautoNameResolution -d C:\temp -extension -J-Djavax.xml.accessExternalSchema=all -J-Djavax.xml.accessExternalDTD=all -keep -verbose -XadditionalHeaders -Xnocompile https://api.sendwordnow.com/webservices/v3/users.svc?wsdl 

Dies scheint zu funktionieren. Zumindest glaube ich es getan zu haben. wsimport hat eine Reihe von Paketen und sogar eine öffentliche Schnittstelle erstellt. Nun, hier ist ein Codeausschnitt, wie ich versuche, eine Verbindung zu einem gültigen Endpunkt herzustellen.

HttpTransportPipe.dump = true; 
Users users = new Users(); 
IUsers iUsers = users.getWSHttpBindingIUsers(); 
((BindingProvider)iUsers).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://api.sendwordnow.com/webservices/v3/Users.svc"); 
((BindingProvider)iUsers).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "somename"); 
((BindingProvider)iUsers).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "somepassword"); 
iUsers.echoAuthenticated("This is an echo test."); 
System.out.println(); 

Ich habe verschiedene Möglichkeiten versucht, den Benutzernamen und das Passwort zu setzen, aber ich immer einen HTTP-Transportfehler erhalten: java.net.ConnectException: Connection timed out: verbinden. Ich bin zu SoapUI gesprungen und habe ein neues Projekt mit der WSDL von https://api.sendwordnow.com/webservices/v3/users.svc?wsdl erstellt. Ich kann eine Anfrage an https://api.sendwordnow.com/webservices/v3/Users.svc senden und mit der richtigen Authentifizierung und der WSS-Password Type-Eigenschaft, die auf PasswordText gesetzt ist, kann ich erfolgreich EchoAuthenticated aufrufen. Hier ist die Ausgabe von SoapUI.

Tue Mar 28 12:42:28 CDT 2017:DEBUG:>> "POST /webservices/v3/Users.svc HTTP/1.1[\r][\n]" 
Tue Mar 28 12:42:28 CDT 2017:DEBUG:>> "Accept-Encoding: gzip,deflate[\r][\n]" 
Tue Mar 28 12:42:28 CDT 2017:DEBUG:>> "Content-Type: application/soap+xml;charset=UTF-8;action="http://www.sendwordnow.com/contract/users/v3/IUsers/EchoAuthenticated"[\r][\n]" 
Tue Mar 28 12:42:28 CDT 2017:DEBUG:>> "Authorization: Basic c2lyaXVzYXBpOnRlbXBvcmFyeTEyMw==[\r][\n]" 
Tue Mar 28 12:42:28 CDT 2017:DEBUG:>> "Content-Length: 1224[\r][\n]" 
Tue Mar 28 12:42:28 CDT 2017:DEBUG:>> "Host: api.sendwordnow.com[\r][\n]" 
Tue Mar 28 12:42:28 CDT 2017:DEBUG:>> "Connection: Keep-Alive[\r][\n]" 
Tue Mar 28 12:42:28 CDT 2017:DEBUG:>> "User-Agent: Apache-HttpClient/4.1.1 (java 1.5)[\r][\n]" 
Tue Mar 28 12:42:28 CDT 2017:DEBUG:>> "[\r][\n]" 
Tue Mar 28 12:42:28 CDT 2017:DEBUG:>> "<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:v3="http://www.sendwordnow.com/contract/users/v3">[\n]" 
Tue Mar 28 12:42:28 CDT 2017:DEBUG:>> " <soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing"><wsse:Security soap:mustUnderstand="true" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"><wsse:UsernameToken wsu:Id="UsernameToken-838F7D896DB9148E2414907229483491"><wsse:Username>somename</wsse:Username><wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">somepassword</wsse:Password><wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">QpJwiZjZex+3ikqVWZp+Yw==</wsse:Nonce><wsu:Created>2017-03-28T17:42:28.348Z</wsu:Created></wsse:UsernameToken></wsse:Security><wsa:Action>http://www.sendwordnow.com/contract/users/v3/IUsers/EchoAuthenticated</wsa:Action></soap:Header>[\n]" 
Tue Mar 28 12:42:28 CDT 2017:DEBUG:>> " <soap:Body>[\n]" 
Tue Mar 28 12:42:28 CDT 2017:DEBUG:>> "  <v3:EchoAuthenticated>[\n]" 
Tue Mar 28 12:42:28 CDT 2017:DEBUG:>> "   <!--Optional:-->[\n]" 
Tue Mar 28 12:42:28 CDT 2017:DEBUG:>> "   <v3:value>This is an echo test.</v3:value>[\n]" 
Tue Mar 28 12:42:28 CDT 2017:DEBUG:>> "  </v3:EchoAuthenticated>[\n]" 
Tue Mar 28 12:42:28 CDT 2017:DEBUG:>> " </soap:Body>[\n]" 
Tue Mar 28 12:42:28 CDT 2017:DEBUG:>> "</soap:Envelope>" 
Tue Mar 28 12:42:29 CDT 2017:DEBUG:<< "HTTP/1.1 200 OK[\r][\n]" 
Tue Mar 28 12:42:29 CDT 2017:DEBUG:<< "Content-Type: application/soap+xml; charset=utf-8[\r][\n]" 
Tue Mar 28 12:42:29 CDT 2017:DEBUG:<< "Server: Microsoft-IIS/8.5[\r][\n]" 
Tue Mar 28 12:42:29 CDT 2017:DEBUG:<< "Date: Tue, 28 Mar 2017 17:42:29 GMT[\r][\n]" 
Tue Mar 28 12:42:29 CDT 2017:DEBUG:<< "Content-Length: 887[\r][\n]" 
Tue Mar 28 12:42:29 CDT 2017:DEBUG:<< "[\r][\n]" 
Tue Mar 28 12:42:29 CDT 2017:DEBUG:<< "<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"><s:Header><a:Action s:mustUnderstand="1">http://www.sendwordnow.com/contract/users/v3/IUsers/EchoAuthenticatedResponse</a:Action><o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><u:Timestamp u:Id="_0"><u:Created>2017-03-28T17:42:29.695Z</u:Created><u:Expires>2017-03-28T17:47:29.695Z</u:Expires></u:Timestamp></o:Security></s:Header><s:Body><EchoAuthenticatedResponse xmlns="http://www.sendwordnow.com/contract/users/v3"><EchoAuthenticatedResult>This is the Users service answering back. The value you sent was: This is an echo test.</EchoAuthenticatedResult></EchoAuthenticatedResponse></s:Body></s:Envelope>" 

Es sieht aus wie ich wsa bin fehlt: Action, wsse: Passwort Art und wsse: Nonce EncodingType. Zumindest war das in der SoapUI-Anfrage. Ich fühle mich, als würde ich alles falsch machen. Ich brauche natürlich diese fehlenden Komponenten, aber ich kann nicht herausfinden, wie man sie tatsächlich implementiert. Irgendwelche Vorschläge wären super hilfreich. Ich dachte, ich würde einige Authentifizierungsfehler erhalten, aber ich kann nicht so weit kommen.

UPDATE 1

Ich bin mir nicht sicher, ob ich näher oder nicht auf das ich immer. Dies ist die SoapUI-Anfrage.

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:v3="http://www.sendwordnow.com/contract/users/v3"> 
<soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing"> 
<wsse:Security soap:mustUnderstand="true" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
<wsse:UsernameToken wsu:Id="UsernameToken-1" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
<wsse:Username> 
*********</wsse:Username> 
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"> 
**********</wsse:Password> 
<wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary"> 
zhVqVXnkOsPCFRZolLSWtw==</wsse:Nonce> 
<wsu:Created> 
2017-03-29T14:05:54.820Z</wsu:Created> 
</wsse:UsernameToken> 
</wsse:Security> 
<wsa:Action> 
http://www.sendwordnow.com/contract/users/v3/IUsers/EchoAuthenticated 
</wsa:Action> 
</soap:Header> 
    <soap:Body> 
     <v3:EchoAuthenticated> 
     <v3:value> 
Test Message</v3:value> 
     </v3:EchoAuthenticated> 
    </soap:Body> 
</soap:Envelope> 

Und hier ist ein Code-Snip.

SOAPElement security = header.addChildElement("Security", "wsse", 
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"); 
SOAPElement userToken = security.addChildElement("UsernameToken", "wsse"); 
userToken.addChildElement("Username", "wsse").addTextNode("someusername"); 
userToken.addChildElement("Password", "wsse").addTextNode("somepassword"); 
userToken.addChildElement("Nonce", "wsse").addTextNode("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary"); 
userToken.addChildElement("Password", "wsse").addTextNode("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"); 
userToken.addChildElement("Action", "wsa"); 

Ich bin nicht mehr Timing, aber ich erhalte jetzt diesen Fehler.

com.sun.xml.internal.ws.streaming.XMLStreamReaderException: unexpected XML tag. expected: {http://www.sendwordnow.com/contract/users/v3}EchoAuthenticatedResponse but found: {http://www.sendwordnow.com/contract/users/v3}EchoAuthenticated 

Muss ich die wsa: action auf eine bestimmte URL einstellen?

Antwort

0

Während dies nicht das einzige Stück war, war es ein wichtiger Teil des Puzzles.

security.addAttribute(soapFactory.createName("S:mustUnderstand"),"1"); 

Ich hatte dies verwendet.

security.addAttribute(soapFactory.createName("SOAP:mustUnderstand"),"True"); 

Ein paar andere Änderungen mit dem Bau des WSSE und WSA Element-Baum gemacht wurde, aber das war wirklich mustunderstand was mir ein paar Trauer. Alles ist gut jetzt.