Java Webservice模板:如何在Webservice模板中传递头
我在企业级使用以下SOAP请求Java Webservice模板:如何在Webservice模板中传递头,java,web-services,soap,soap-client,webservice-client,Java,Web Services,Soap,Soap Client,Webservice Client,我在企业级使用以下SOAP请求 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header> .... </soapenv:Header> <soapenv:Body> <UserRQ xmlns="http://www.user.org/USER/INFO&q
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
....
</soapenv:Header>
<soapenv:Body>
<UserRQ xmlns="http://www.user.org/USER/INFO" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
...
....
...
为了使用postman(或其他)来访问API,我正在使用WebServiceClient,目前正在将整个请求(包括头和正文)传递给它
ApplicationClient.java:
public class ApplicationClient extends WebServiceGatewaySupport {
//Envelope is the whole request
public ResponseEntity<String> getResults(Envelope envelope) {
WebServiceTemplate webServiceTemplate = new WebServiceTemplate();
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setContextPath("org.test.wsdl");
webServiceTemplate.setMarshaller(marshaller);
webServiceTemplate.setUnmarshaller(marshaller);
ResponseEntity<String> response = (ResponseEntity<String>) webServiceTemplate.marshalSendAndReceive("<URL>", envelope);
log.info(response.getStatusCode());
return response;
}
}
公共类应用程序客户端扩展了WebServiceGatewaySupport{
//信封就是整个请求
公共响应获取结果(信封){
WebServiceTemplate WebServiceTemplate=新的WebServiceTemplate();
Jaxb2Marshaller-marshaller=新的Jaxb2Marshaller();
setContextPath(“org.test.wsdl”);
setMarshaller(marshaller);
setUnmarshaller(marshaller);
ResponseEntity response=(ResponseEntity)webServiceTemplate.MarshallSendReceive(“,信封”);
log.info(response.getStatusCode());
返回响应;
}
}
响应正确(得到200个响应代码)。是否仍然可以通过webservice客户端分别传递标题和正文?或者,我们如何整理标题?在Web服务调用中无法分别传递标题和正文。相反,有一些机制可以改变构造的消息,我们可以利用这些机制向报头添加身份验证,也可以向报头添加自定义元素。为此,我们需要额外的SpringWS依赖项
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-security</artifactId>
<version>3.0.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-support</artifactId>
<version>3.0.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.wss4j</groupId>
<artifactId>wss4j-parent</artifactId>
<version>2.3.0</version>
<type>pom</type>
</dependency>
然后添加WebServiceMessageCallback实例以覆盖完成的消息
webServiceTemplate.marshalSendAndReceive(url, request, new CustomWebServiceMessageCallback());
在CustomWebServiceMessageCallback内部,通过使用以下方法,我们可以访问标头并对其进行修改
@Override
public void doWithMessage(WebServiceMessage webServiceMessage) throws IOException, TransformerException {
SoapMessage soapMessage = (SoapMessage) webServiceMessage;
SoapHeader header = soapMessage.getSoapHeader();
StringSource headerSource = new StringSource("<additional-header-element>HEADER_TEXT</additional-header-element>");
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(headerSource, header.getResult());
}
@覆盖
public void doWithMessage(WebServiceMessage WebServiceMessage)引发IOException、TransformerException{
SoapMessage SoapMessage=(SoapMessage)webServiceMessage;
SoapHeader=soapMessage.getSoapHeader();
StringSource headerSource=新的StringSource(“标题文本”);
Transformer Transformer=TransformerFactory.newInstance().newTransformer();
transform(headerSource,header.getResult());
}
@Override
public void doWithMessage(WebServiceMessage webServiceMessage) throws IOException, TransformerException {
SoapMessage soapMessage = (SoapMessage) webServiceMessage;
SoapHeader header = soapMessage.getSoapHeader();
StringSource headerSource = new StringSource("<additional-header-element>HEADER_TEXT</additional-header-element>");
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(headerSource, header.getResult());
}