我想使用ksoap2在
android中创建带有安全头的soap信封.我的android代码是……
import org.ksoap2.SoapEnvelope; import org.ksoap2.SoapFault; import org.ksoap2.serialization.PropertyInfo; 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 android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class SOP_WebService extends Activity { private final String NAMESPACE = "http://xmlns.oracle.com/WorklistRetrival"; private final String URL = "http://www.sample.com/orabpel/default/WorklistRetrival/1.0"; private final String SOAP_ACTION = "process"; private final String METHOD_NAME = "WorklistRetrievalREQ"; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.soap_webservice); Button btnClick = (Button) findViewById(R.id.btnClick); btnClick.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { callWebservice(); } }); } public void callWebservice() { SoapObject request = new SoapObject(NAMESPACE,METHOD_NAME); PropertyInfo pi = new PropertyInfo(); pi.setNamespace(NAMESPACE); pi.setName("WorklistType"); pi.setValue("PO_REQUISITION"); request.addProperty(pi); PropertyInfo p2 = new PropertyInfo(); p2.setNamespace(NAMESPACE); p2.setName("Status"); p2.setValue("TODO"); request.addProperty(p2); PropertyInfo p3 = new PropertyInfo(); p3.setNamespace(NAMESPACE); p3.setName("Mode"); p3.setValue(""); request.addProperty(p3); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.setOutputSoapObject(request); HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); Log.i("bodyout","" + envelope.bodyOut.toString()); try { androidHttpTransport.debug = true; androidHttpTransport.call(SOAP_ACTION,envelope); SoapPrimitive response = (SoapPrimitive)envelope.getResponse(); Log.i("myApp",response.toString()); Log.i("request","" + envelope.bodyIn); Log.i("response","" + envelope.bodyOut); Log.i("request","" + androidHttpTransport.requestDump); Log.i("response","" + androidHttpTransport.responseDump); } catch (SoapFault e) { Log.d("soapFault","soapFault"); e.printStackTrace(); } catch (Exception e) { Log.d("Exception","Exception"); e.printStackTrace(); Log.d("Exception Generated",""+e.getMessage()); } } }
上面的代码创建下面没有安全标头的soap请求.
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <soap:Header> </soap:Header> <soap:Body xmlns:ns1="http://xmlns.oracle.com/bpel/aubi/mobile/Worklist"> <ns1:WorklistRetrievalREQ> <ns1:WorklistType>HR_OFFER</ns1:WorklistType> <ns1:Status>TODO</ns1:Status> <ns1:Mode/> </ns1:WorklistRetrievalREQ> </soap:Body> </soap:Envelope>
但我需要使用安全标头创建下面的soap请求
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <soap:Header> <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" soap:mustUnderstand="1"> <wsse:UsernameToken xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> <wsse:Username>cbrown</wsse:Username> <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">welcome</wsse:Password></wsse:UsernameToken> </wsse:Security> </soap:Header> <soap:Body xmlns:ns1="http://xmlns.oracle.com/bpel/aubi/mobile/Worklist"> <ns1:WorklistRetrievalREQ> <ns1:WorklistType>HR_OFFER</ns1:WorklistType> <ns1:Status>TODO</ns1:Status> <ns1:Mode/> </ns1:WorklistRetrievalREQ> </soap:Body> </soap:Envelope>
请告诉我这段代码做了哪些更改
解决方法
我找到了问题的答案.我回答有用的其他人.
public class SOAP_WebService extends Activity { private final String NAMESPACE = "http://ws.simple/"; private final String URL = "http://10.0.2.2/SimpleWebservice/simple"; private final String SOAP_ACTION = "http://ws.simple/getString"; private final String METHOD_NAME = "getString"; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.soap_webservice); Button btnClick = (Button) findViewById(R.id.btnClick); btnClick.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { callWebservice(); } }); } public void callWebservice() { SoapObject request = new SoapObject(NAMESPACE,METHOD_NAME); PropertyInfo weightProp =new PropertyInfo(); weightProp.name = "arg0"; weightProp.setValue("rajan"); request.addProperty(weightProp); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); // create header Element[] header = new Element[1]; header[0] = new Element().createElement("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd","Security"); header[0].setAttribute(null,"mustUnderstand","1"); Element usernametoken = new Element().createElement("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd","UsernameToken"); usernametoken.setAttribute(null,"Id","UsernameToken-1"); header[0].addChild(Node.ELEMENT,usernametoken); Element username = new Element().createElement(null,"n0:Username"); username.addChild(Node.IGNORABLE_WHITESPACE,"CBROWN"); usernametoken.addChild(Node.ELEMENT,username); Element pass = new Element().createElement(null,"n0:Password"); pass.setAttribute(null,"Type","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"); pass.addChild(Node.TEXT,"welcome"); usernametoken.addChild(Node.ELEMENT,pass); // add header to envelope envelope.headerOut = header; Log.i("header","" + envelope.headerOut.toString()); envelope.dotNet = false; envelope.bodyOut = request; envelope.setOutputSoapObject(request); HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); Log.i("bodyout",envelope); SoapPrimitive response = (SoapPrimitive)envelope.getResponse(); Log.i("myApp",response.toString()); } catch (SoapFault e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); Log.d("Exception Generated",""+e.getMessage()); } } }