2017-08-27 1 views
0

Wie fügen Sie eine Kopfzeile für die Web-Service-Client-Anfrage hinzu, die wie folgt aussieht: XML?
Das untenstehende XML ist eine Anfrage, die automatisch von der SOAP UI generiert wurde und funktioniert gut, wenn der Benutzername/das Passwort korrekt eingegeben wurde.Hinzufügen einer Kopfzeile zur Web-Service-Anfrage mit CXF

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:dof="http://dof.ad.com"> 
    <soapenv:Header> 
     <dof:UserCredentials> 
     <!--Optional:--> 
     <dof:userName></dof:userName> 
     <!--Optional:--> 
     <dof:password></dof:password> 
     </dof:UserCredentials> 
    </soapenv:Header> 
    <soapenv:Body> 
     <dof:CheckService/> 
    </soapenv:Body> 
</soapenv:Envelope> 

Ich würde gerne wissen, wie der Header-Teil mit Apache CXF hinzugefügt werden kann. Ich habe einen Code mit CXF aus WSDL automatisch generiert (siehe unten) und verschiedene Artikel überprüft, aber der Code funktioniert immer noch nicht. Ich gehe davon aus, dass die gesendete Anfrage nicht korrekt ist oder keine Kopfzeile hat.

public static void checkServiceMan() { 
    String address = "https://WSDL_URL"; 

    JaxWsProxyFactoryBean jaxWsProxy = new JaxWsProxyFactoryBean(); 
    jaxWsProxy.setServiceClass(DOFairservice.class); 
    jaxWsProxy.setAddress(address); 

    DOFairservice serviceClient = (DOFairservice) jaxWsProxy.create(); 

    ObjectFactory factory = new ObjectFactory(); 
    UserCredentials uc = factory.createUserCredentials(); 
    uc.setUserName("username"); 
    uc.setPassword("password"); 

    List<Header> headerList = new ArrayList<Header>(); 
    try { 

     Header testCredentialsHeader = new Header(new QName("http://DOF", "DOFairservice") 
       ,uc 
       ,new JAXBDataBinding(UserCredentials.class)); 

     headerList.add(testCredentialsHeader); 

    } catch (JAXBException e) { 

     e.printStackTrace(); 
    } 
    ((BindingProvider) serviceClient).getResponseContext().put(Header.HEADER_LIST, headerList); 

    Client client = ClientProxy.getClient(serviceClient); 
    HTTPConduit conduit = (HTTPConduit) client.getConduit(); 
    HTTPClientPolicy policy = conduit.getClient(); 
    policy.setReceiveTimeout(10000); 

    String resp = serviceClient.checkService(); **<--- ERROR HERE** 
    System.out.println("Response from Customs Web Service: "+ resp); 

    System.out.println("Web Service Header Test Done"); 
} 

Fehlermeldung

Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: Error reading XMLStreamReader: Unexpected character '8' (code 56) in prolog; expected '<' 
at [row,col {unknown-source}]: [1,1] 
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:161) 
    at com.sun.proxy.$Proxy45.checkService(Unknown Source) 
    at ae.abudhabi.dof.client.CheckServiceClient.checkServiceMan(CheckServiceClient.java:103) 
    at ae.abudhabi.dof.client.CheckServiceClient.main(CheckServiceClient.java:112) 
Caused by: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '8' (code 56) in prolog; expected '<' 

Antwort

1

fand ich eine einfache Lösung Header auf die Anfragen, die ich an den Web Service gesendet hinzuzufügen. Alles, was ich tun musste, war nur den zusätzlichen Code unten auf meinem Maven CXF Plugin Build hinzuzufügen.

<extendedSoapHeaders>true</extendedSoapHeaders> 

Die zusätzliche Zeile oben funktioniert nur, wenn die Seife Kopfteil explizit in der WSDL-Datei deklariert wird, was in meinem Fall ist.

<wsdl:input> 
<soap:body use="literal"/> 
<soap:header message="tns:CheckUserCredentials" part="UserCredentials" use="literal"/> 
</wsdl:input> 

ich die Quelle erneut erzeugt und modifiziert siehe unten

public static void checkServiceMan() { 
    String address = "https://WSDL_URL"; 

    JaxWsProxyFactoryBean jaxWsProxy = new JaxWsProxyFactoryBean(); 
    jaxWsProxy.setServiceClass(DOFairservice.class); 
    jaxWsProxy.setAddress(address); 

    DOFairservice serviceClient = (DOFairservice) jaxWsProxy.create(); 

    ObjectFactory factory = new ObjectFactory(); 
    UserCredentials uc = factory.createUserCredentials(); 
    uc.setUserName("username"); 
    uc.setPassword("password"); 

    String resp = serviceClient.checkService(uc); **<--- New Argument Here** 
    System.out.println("Response from Customs Web Service: "+ resp); 

    System.out.println("Web Service Header Test Done"); 
} 

Alles funktionierte gut und der Header wird nun auf die XML-Anforderungen an den Webdienst gesendet eingeführt wird.

+0

wollte nur klarstellen, dass true im Bereich festgelegt ist. – lemonpro

Verwandte Themen