Я новичок в SOAP и пытаюсь получить некоторые данные из веб-службы SOAP.есть только один метод, который я могу вызвать непосредственно из WS, который хорошо работает с методами, сгенерированными (port, proxy, service ..) из файла WSDL, но для других методов, которые мне нужны, требуется заголовок аутентификации, подобный этому:
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<AuthHeader xmlns="http://localhost/webservices/map2">
<UserName>string</UserName>
<Password>string</Password>
<Secure>boolean</Secure>
</AuthHeader>
</soap:Header>
после некоторых исследований я нашел это решение с помощью SOAPHandler:
public boolean handleMessage(SOAPMessageContext context) {
Boolean isRequest = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (isRequest) {
try {
SOAPMessage soapMsg = context.getMessage();
SOAPEnvelope soapEnv = soapMsg.getSOAPPart().getEnvelope();
SOAPHeader soapHeader = soapEnv.getHeader();
if (soapHeader == null) {
soapHeader = soapEnv.addHeader();
}
// add a soap headers
QName qnameAuthHeader = new QName("http://localhost/webservices/map2", "AuthHeader");
SOAPHeaderElement soapAuthHeader = soapHeader.addHeaderElement(qnameAuthHeader);
soapAuthHeader.setActor(SOAPConstants.URI_SOAP_ACTOR_NEXT);
soapAuthHeader.addAttribute(new QName("http://localhost/webservices/map2", "UserName"), "user1");
soapAuthHeader.addAttribute(new QName("http://localhost/webservices/map2", "Password"), "pass1");
soapAuthHeader.addAttribute(new QName("http://localhost/webservices/map2", "Secure"), "false");
soapMsg.saveChanges();
// tracking
soapMsg.writeTo(System.out);
} catch (SOAPException e) {
System.err.println(e);
} catch (IOException e) {
System.err.println(e);
}
}
return true;
}
, но когда я запускаю это
ServiceSoapProxy proxy = new ServiceSoapProxy("http://localhost/ws3.0/service.asmx?wsdl");
ServiceSoap service = proxy.getServiceSoap();
Binding binding = ((BindingProvider) service).getBinding();
, я получаю это:
Exception in thread "main" java.lang.ClassCastException: localhost.webservices.map2.ServiceSoapStub cannot be cast to javax.xml.ws.BindingProvider
at test.devs.MailiTest.main(MailiTest.java:33)