您好我想使用上面的肥皂xml
来请求肥皂<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:sap-com:document:sap:soap:functions:mc-style">
<soapenv:Header/>
<soapenv:Body>
<urn:AvailCheck>
<IUvail>
<Unit>PC</Unit>
<Qty>3000</Qty>
</IUvail>
</urn:AvailCheck>
</soapenv:Body>
</soapenv:Envelope>
所以我使用ksoap库创建了一个代码。我为soapobject创建了一个对象
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
并添加了这样的属性
request.addProperty("Unit", "PC");
request.addProperty("Qty", "3000");
但问题是我无法在requset中添加<IUvail>
..那么我该如何添加呢?
答案 0 :(得分:8)
您可以像这样传递复杂对象(IUvail):
IUvail.java
import java.util.Hashtable;
import org.ksoap2.serialization.KvmSerializable;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
public class IUvail implements KvmSerializable {
private String unit;
private int qty;
public IUvail() {}
public IUvail(String unit, int qty) {
this.unit = unit;
this.qty = qty;
}
public void setUnit(String unit) { this.unit = unit; }
public void setQty(int qty) { this.qty = qty;}
public String getUniy() { return unit;}
public int getQty() { return qty;}
public Object getProperty(int arg0) {
switch(arg0) {
case 0:
return unit;
case 1:
return qty;
}
return null;
}
public int getPropertyCount() {
return 2;
}
public void getPropertyInfo(int index, Hashtable arg1, PropertyInfo propertyInfo) {
switch(index){
case 0:
propertyInfo.name = "unit";
propertyInfo.type = PropertyInfo.STRING_CLASS;
break;
case 1:
propertyInfo.name = "qty";
propertyInfo.type = PropertyInfo.INTEGER_CLASS;
break;
default:
break;
}
}
public void setProperty(int index, Object value) {
switch(index) {
case 0:
this.unit = value.toString();
break;
case 1:
this.qty = Integer.parseInt(value.toString());
break;
default:
break;
}
} }
然后
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
IUvail iuvail = new IUvail();
iuvail.setUnit("PC");
iuvail.setQty(3000);
request.addProperty("IUvail", iuvail);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
envelope.addMapping(TARGET_NAMESPACE, "IUvail", new IUvail.getClass());
AndroidHttpTransport transport = new AndroidHttpTransport(URL);
try {
transport.call(NAMESPACE + METHOD_NAME, envelope);
/* Get the response: it depends on your web service implementation */
} catch (Exception e) {
e.printStackTrace();
}
NAMESPACE,网址,METHOD_NAME和TARGET_NAMESPACE取决于您的ws。
答案 1 :(得分:1)
我遇到了同样的问题(使用Android访问SAP Web服务)。有一个简单的解决方案:
request.addProperty("IUvail", "<Unit>PC</Unit><Qty>3000</Qty>");
使用身份验证的整个访问权限:
String USER = "user";
String PASSWORD = "pwd";
String NAMESPACE_SOAP = "http://schemas.xmlsoap.org/soap/envelope/";
String NAMESPACE_SAP = "urn:sap-com:document:sap:rfc:functions";
String SOAP_ACTION = "http://server:port/webservice_root";
String METHOD_NAME = "AvailCheck";
SoapObject request = new SoapObject(NAMESPACE_SAP, METHOD_NAME);
request.addProperty("IUvail", "<Unit>PC</Unit><Qty>3000</Qty>");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.env = NAMESPACE_SOAP;
envelope.dotNet = false;
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(
SOAP_ACTION);
androidHttpTransport.debug = true;
try {
List<HeaderProperty> headerList = new ArrayList<HeaderProperty>();
headerList.add(new HeaderProperty("Authorization", "Basic "
+ org.kobjects.base64.Base64
.encode((USER + ":" + PASSWORD).getBytes())));
androidHttpTransport.call(SOAP_ACTION, envelope, headerList);
// SoapObject response = (SoapObject) envelope.getResponse();
// response.getProperty(0).toString();
// Object response = envelope.getResponse();
SoapPrimitive result = (SoapPrimitive) envelope.getResponse();
Log.d("webservice", "Result: " + result.toString());
} catch (Exception e) {
e.printStackTrace();
Log.e("WebserviceException", e.getMessage(), e);
Log.d("WebserviceException", "[requestDump] "
+ androidHttpTransport.requestDump);
Log.d("WebserviceException", "[responseDump] "
+ androidHttpTransport.responseDump);
}
答案 2 :(得分:-3)
尝试做这样的事情,
SoapObject request = new SoapObject(NAMESPACE,
METHOD_NAME);
request.addProperty("username", username);
request.addProperty("username", password);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(
URL);
try {
androidHttpTransport.call(SOAP_ACTION, envelope);
} catch (IOException ioex) {
ioex.printStackTrace();
}