搞了几天的研究,终于搞出三种调用方式
第一种:
SoapObject request = new SoapObject(“http://rkxx.ws.sq.lb.com/“, “view”);
request.addProperty(“arg0”, “E5BE68C1153F2076”);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut = request;
HttpTransportSE ht=new HttpTransportSE(“http://192.168.1.202:8080/lbkj_esb/webservice/rkxxWS?wsdl“);
try {
ht.call(null,envelope);
} catch (IOException | XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
SoapObject soapObject =( SoapObject) envelope.getResponse();
} catch (SoapFault e) {
// TODO Auto-generated catch block
e.printStackTrace();
第二种:
package com.lb.sq.ws.security;
import java.io.IOException;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
import org.apache.ws.security.WSPasswordCallback;
public class WsClinetAuthHandler implements CallbackHandler {
public void handle(Callback[] callbacks) throws IOException,
UnsupportedCallbackException {
// TODO Auto-generated method stub
for (int i = 0; i < callbacks.length; i++) {
WSPasswordCallback pc = (WSPasswordCallback) callbacks[i];
// System.out.println("identifier: " + pc.getIdentifier());
// 这里必须设置密码,否则会抛出:java.lang.IllegalArgumentException: pwd == null
// but a password is needed
pc.setIdentifier("lbkj");
pc.setPassword("123456");//密码
}
}
}
调用:
Map<String, Object> outProps = new HashMap<String, Object>();
outProps.put(WSHandlerConstants.ACTION,
WSHandlerConstants.USERNAME_TOKEN);
outProps.put(WSHandlerConstants.USER, "lbkj2");
outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
// 指定在调用远程ws之前触发的回调函数WsClinetAuthHandler,其实类似于一个拦截器
outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS,
WsClinetAuthHandler.class.getName());
ArrayList list = new ArrayList();
// 添加cxf安全验证拦截器,必须
list.add(new SAAJOutInterceptor());
list.add(new WSS4JOutInterceptor(outProps));
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
// WebServiceSample服务端接口实现类,这里并不是直接把服务端的类copy过来,具体请参考http://learning.iteye.com/blog/1333223
factory.setServiceClass(RkxxWS.class);
// 设置ws访问地址
factory.setAddress("http://192.168.1.202:8080/lbkj_esb/webservice/rkxxWS?wsdl");
//注入拦截器,用于加密安全验证信息
factory.getOutInterceptors().addAll(list);
RkxxWS service = (RkxxWS) factory.create();
String response = service.view("E5BE68C1153F2076");
System.out.println(response);