java soap 头,如何使用wsdl生成的java对象发出soap请求时添加soap标头

I generated client java objects using JAX-WS RI. I am trying to make a SOAP request to a web service. Service requires authentication in the header which looks like below:

username@gmail.com

password1

true

2

The generated java objects have methods for calling the service, creating the objects and constructing the header. But, I am having trouble setting the header while making the call.

Here's the code that I am using:

IpsApiService service = new IpsApiService();

IpsApiPortType port = service.getIpsApiSoapPort();

SearchAssetsParam searchAssetsParam = buildSearchAssetsParam();

SearchAssetsReturn response = port.searchAssets(searchAssetsParam);

buildSearchAssetsParam() constructs the request object.

I created the header object as follows:

AuthHeader header = new AuthHeader();

header.setUser("username@gmail.com");

header.setPassword("password1");

How do I set this AuthHeader to the service request?

Thanks,

Venu

解决方案

Once I had the same problem. I needed to modify the JAX-WS web service SOAP header at every request. To solve this problem I have created a handler like this:

public class MyHandler implements SOAPHandler {

private static final Logger LOGGER = LoggerFactory.getLogger(MyHandler.class);

private String username;

private String password;

@Override

public boolean handleMessage(SOAPMessageContext context) {

try {

SOAPMessage message = context.getMessage();

SOAPHeader header = message.getSOAPHeader();

SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();

if (header == null) {

header = envelope.addHeader();

}

QName qNameUserCredentials = new QName("https://your.target.namespace/", "UserCredentials");

SOAPHeaderElement userCredentials = header.addHeaderElement(qNameUserCredentials);

QName qNameUsername = new QName("https://your.target.namespace/", "Username");

SOAPHeaderElement username = header.addHeaderElement(qNameUsername );

username.addTextNode(this.username);

QName qNamePassword = new QName("https://your.target.namespace/", "Password");

SOAPHeaderElement password = header.addHeaderElement(qNamePassword);

password.addTextNode(this.password);

userCredentials.addChildElement(username);

userCredentials.addChildElement(password);

message.saveChanges();

//TODO: remove this writer when the testing is finished

StringWriter writer = new StringWriter();

message.writeTo(new StringOutputStream(writer));

LOGGER.debug("SOAP message: \n" + writer.toString());

} catch (SOAPException e) {

LOGGER.error("Error occurred while adding credentials to SOAP header.", e);

} catch (IOException e) {

LOGGER.error("Error occurred while writing message to output stream.", e);

}

return true;

}

//TODO: remove this class after testing is finished

private static class StringOutputStream extends OutputStream {

private StringWriter writer;

public StringOutputStream(StringWriter writer) {

this.writer = writer;

}

@Override

public void write(int b) throws IOException {

writer.write(b);

}

}

@Override

public boolean handleFault(SOAPMessageContext context) {

LOGGER.debug("handleFault has been invoked.");

return true;

}

@Override

public void close(MessageContext context) {

LOGGER.debug("close has been invoked.");

}

@Override

public Set getHeaders() {

LOGGER.debug("getHeaders has been invoked.");

return null;

}

public void setUsername(String username) {

this.username = username;

}

public void setPassword(String password) {

this.password = password;

}

}

It adds the needed parameters to my SOAP header and it is invoked on every request. All you need to do is to modify handleMessage method to suit your needs.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值