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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值