使用 CXF 在 Web 服务请求上添加 header
Add a header on Web Service request using CXF
如何在如下所示的 Web 服务客户端请求上添加 header XML?
下面的 xml 是 SOAP UI 的请求 auto-generated,如果 username/password 正确,它可以正常工作。
<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>
我想知道如何使用 apache CXF 添加 header 部分。我已经 auto-generated 使用 WSDL 中的 CXF 的代码(见下文)并检查了各种文章,但代码仍然无法正常工作。我假设发送的请求不正确或者没有 header。
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");
}
错误信息
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 '<'
我找到了一个简单的解决方案,可以在发送到 Web 服务的请求中添加 header。
我需要做的只是在我的 Maven CXF 插件构建中添加下面的额外代码。
<extendedSoapHeaders>true</extendedSoapHeaders>
只有在 wsdl 中明确声明了 soap header 部分时,上面的额外行才有效,在我的例子中。
<wsdl:input>
<soap:body use="literal"/>
<soap:header message="tns:CheckUserCredentials" part="UserCredentials" use="literal"/>
</wsdl:input>
我re-generated出处和修改见下文
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");
}
一切正常,header 现在已插入到发送到 Web 服务的 XML 请求中。
如何在如下所示的 Web 服务客户端请求上添加 header XML?
下面的 xml 是 SOAP UI 的请求 auto-generated,如果 username/password 正确,它可以正常工作。
<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>
我想知道如何使用 apache CXF 添加 header 部分。我已经 auto-generated 使用 WSDL 中的 CXF 的代码(见下文)并检查了各种文章,但代码仍然无法正常工作。我假设发送的请求不正确或者没有 header。
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");
}
错误信息
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 '<'
我找到了一个简单的解决方案,可以在发送到 Web 服务的请求中添加 header。 我需要做的只是在我的 Maven CXF 插件构建中添加下面的额外代码。
<extendedSoapHeaders>true</extendedSoapHeaders>
只有在 wsdl 中明确声明了 soap header 部分时,上面的额外行才有效,在我的例子中。
<wsdl:input>
<soap:body use="literal"/>
<soap:header message="tns:CheckUserCredentials" part="UserCredentials" use="literal"/>
</wsdl:input>
我re-generated出处和修改见下文
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");
}
一切正常,header 现在已插入到发送到 Web 服务的 XML 请求中。