感谢万能的互联网,废话少说,挑关键代码上了。
服务端:
//服务接口
import javax.jws.WebParam;
import javax.jws.WebService;
import com.jnbus.beans.DemoBean;
@WebService
public interface JNBusWsI {
public byte[] testA(@WebParam(name="a")int pA, @WebParam(name="b")DemoBean pB);
public String testB(@WebParam(name="c")int pC, @WebParam(name="d")String pD);
}
//接口实现类
import com.jnbus.beans.DemoBean;
public class JNBusWsImpl implements JNBusWsI {
public byte[] testA(int pa, DemoBean pb) {
return new DemoBean(pa, pb.getName() + "###").serialize();
}
public String testB(int pc, String pd) {
return "testB responsed, and the param you passed is " + pc + "-" + pd;
}
}
//测试中需要传递和返回的对象
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
public class DemoBean implements IBaseBean {
private int id;
private String name;
public DemoBean() {
}
public DemoBean(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public byte[] serialize() {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
try {
dos.writeInt(this.id);
dos.writeUTF(this.name);
} catch (IOException e) {
} finally {
try {
if (dos != null)
dos.close();
if (baos != null)
baos.close();
} catch (IOException e) {
}
}
return baos.toByteArray();
}
}
public interface IBaseBean {
public byte[] serialize();
}
//顺便把验证用户密码的也复制过来
//没看到ksoap支持wsse的例子
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.saaj.SAAJInInterceptor;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.NodeList;
public class SAuthHeaderInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
private SAAJInInterceptor saajIn = new SAAJInInterceptor();
private final static String NAMESPACE = "http://jnbus.com/";
public SAuthHeaderInterceptor() {
super(Phase.PRE_PROTOCOL);
getAfter().add(SAAJInInterceptor.class.getName());
}
public void handleMessage(SoapMessage msg) throws Fault {
SOAPMessage soapMessage = getSOAPMessage(msg);
if (soapMessage != null) {
try {
SOAPHeader soapHeader = soapMessage.getSOAPHeader();
if (soapHeader != null) {
NodeList nodeList = soapHeader.getElementsByTagNameNS(NAMESPACE, "AuthName");
if (nodeList != null && nodeList.item(0) != null) {
String authName = nodeList.item(0).getTextContent();
if (authName.equals("jnbus")) {
nodeList = soapHeader.getElementsByTagNameNS(NAMESPACE, "AuthPassword");
if (nodeList != null && nodeList.item(0) != null) {
String authPsw = nodeList.item(0).getTextContent();
if (!authPsw.equals("jnbuspsw")) {
throw new Fault(new IllegalArgumentException("AuthPassword Wrong"));
}
} else {
throw new Fault(new IllegalArgumentException("You should add AuthPassword"));
}
} else {
throw new Fault(new IllegalArgumentException("AuthName Wrong"));
}
} else {
throw new Fault(new IllegalArgumentException("You should add AuthName"));
}
}
} catch (SOAPException e) {
}
}
}
private SOAPMessage getSOAPMessage(SoapMessage msg) {
SOAPMessage SOAPMsg = msg.getContent(SOAPMessage.class);
if (SOAPMsg == null) {
saajIn.handleMessage(msg);
SOAPMsg = msg.getContent(SOAPMessage.class);
}
return SOAPMsg;
}
}
android端:
//要想把类对象当作参数传递出去,需实现KvmSerializable接口,并实现其中方法
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.util.Hashtable;
import org.ksoap2.serialization.KvmSerializable;
import org.ksoap2.serialization.PropertyInfo;
public class DemoBean implements KvmSerializable{
private int id;
private String name;
public DemoBean() {
}
public DemoBean(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static DemoBean deserialize(byte[] data) {
ByteArrayInputStream bais = new ByteArrayInputStream(data);
DataInputStream dis = new DataInputStream(bais);
DemoBean demoBean = new DemoBean();
try {
demoBean.setId(dis.readInt());
demoBean.setName(dis.readUTF());
} catch (NumberFormatException e) {
} catch (IOException e) {
} finally {
try {
if (bais != null)
bais.close();
if (dis != null)
dis.close();
} catch (IOException e) {
}
}
return demoBean;
}
@Override
public Object getProperty(int arg0) {
switch (arg0) {
case 0:
return this.id;
case 1:
return this.name;
default:
break;
}
return null;
}
@Override
public int getPropertyCount() {
return 2;
}
@Override
public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) {
switch (arg0) {
case 0:
arg2.type = PropertyInfo.INTEGER_CLASS;
arg2.name = "id";
break;
case 1:
arg2.type = PropertyInfo.STRING_CLASS;
arg2.name = "name";
break;
default:
break;
}
}
@Override
public void setProperty(int arg0, Object arg1) {
switch (arg0) {
case 0 :
id = Integer.valueOf(arg1.toString());
break;
case 1 :
name = arg1.toString();
break;
default:
break;
}
}
}
//
import org.kobjects.base64.Base64;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.kxml2.kdom.Element;
import org.kxml2.kdom.Node;
import com.njty.beans.DemoBean;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class DemoWebServiceActivity extends Activity {
public static String NAMESPACE = "http://jnbus.com/";
public String methodName = "testA";
public String soapAction = NAMESPACE + methodName;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn = (Button)findViewById(R.id.btnQuery);
btn.setOnClickListener(new View.OnClickListener() {
TextView tv = (TextView)findViewById(R.id.ret);
@Override
public void onClick(View v) {
tv.setText(getWS());
}
});
}
public String getWS() {
String ret = null;
try {
SoapObject request = new SoapObject(NAMESPACE, methodName);
request.addProperty("a", 420);
request.addProperty("b", new DemoBean(1, "ss"));
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = false;
envelope.setOutputSoapObject(request);
envelope.headerOut = new Element[2];
envelope.headerOut[0] = getAuthName();
envelope.headerOut[1] = getAuthPsw();
HttpTransportSE ht = new HttpTransportSE("http://192.168.6.19:8008/JNBusWS");
ht.call(soapAction, envelope);
if (envelope.getResponse() != null) {
SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
ret = response.toString();
byte[] bytes = Base64.decode(ret);
DemoBean demoBean = DemoBean.deserialize(bytes);
ret = "Id=" + demoBean.getId() + " Name=" + demoBean.getName();
}
} catch (Exception e) {
ret = e.getMessage();
}
return ret;
}
private Element getAuthName() {
//Element header = new Element().createElement(NAMESPACE, "AuthUser");
Element authName = new Element().createElement(NAMESPACE, "AuthName");
authName.addChild(Node.TEXT, "jnbus");
return authName;
}
private Element getAuthPsw() {
Element authPsw = new Element().createElement(NAMESPACE, "AuthPassword");
authPsw.addChild(Node.TEXT, "jnbuspsw");
return authPsw;
}
}