问题描述
- 使用ksoap2传递字符串数组到webservice
- 在android程序中有一个Web Client使用ksoap2,但是还是不能把字符串数组作为一个参数传递到webservice中。
贴出相关代码:String[] items={""hello""world""};request.addproperty(""str""items);
请求大家的帮忙,谢谢!
解决方案
好像只能一条条加
public class ExtendedSoapObject extends SoapObject{ public ExtendedSoapObject(String namespace String name) { super(namespace name); } public ExtendedSoapObject(SoapObject o) { super(o.getNamespace() o.getName()); for (int i = 0; i < o.getAttributeCount(); i++) { AttributeInfo ai = new AttributeInfo(); o.getAttributeInfo(i ai); ai.setValue(o.getAttribute(i)); addAttribute(ai); } for (int i = 0; i < o.getPropertyCount(); i++) { PropertyInfo pi = new PropertyInfo(); o.getPropertyInfo(i pi); pi.setValue(o.getProperty(i)); addProperty(pi); } } @Override public SoapObject addProperty(String name Object value) { if (value instanceof Object[]) { Object[] subValues = (Object[]) value; for (int i = 0; i < subValues.length; i++) { super.addProperty(name subValues[i]); } } else { super.addProperty(name value); } return this; } @Override public Object getProperty(String name) { List<Object> result = new ArrayList<Object>(); for (int i = 0; i < properties.size(); i++) { PropertyInfo prop = (PropertyInfo) properties.elementAt(i); if (prop.getName() != null && prop.getName().equals(name)) { result.add(unwrap(prop)); } } if (result.size() == 1) { return result.get(0); } else if (result.size() > 1) { return result.toArray(new Object[0]); } else { return null; } } public Object[] getArrayProperty(String name) { Object o = getProperty(name); Object values[] = null; if (o != null) { if (o instanceof Object[]) { values = (Object[]) o; } else { values = new Object[1]; values[0] = o; } } return values; } Object unwrap(Object o) { if (o instanceof PropertyInfo) { return unwrap(((PropertyInfo) o).getValue()); } else if (o instanceof SoapPrimitive || o instanceof SoapObject) { return o; } return null; }}
不知此类对你是否有参考价值
解决方案二:
首先使用""soapUI""来看正确的请求结构(如名字 item names命名空间item namespaces)。假定你想在请求里这样写XML(n0和n1是命名空间):
<n0:strarray xmlns:n0=""http://n0 ..."" xmlns:n1=""http://n1 ...""> <n1:string>hello</n1:string> <n1:string>world</n1:string></n0:strarray>
从vector继承一个类:
import java.util.Hashtable;import java.util.Vector;import org.ksoap2.serialization.KvmSerializable;import org.ksoap2.serialization.PropertyInfo;public class StringArraySerializer extends Vector<String> implements KvmSerializable { //n1 stores item namespaces: String n1 = ""http://n1 ...""; @Override public Object getProperty(int arg0) { return this.get(arg0); } @Override public int getPropertyCount() { return this.size(); } @Override public void getPropertyInfo(int arg0 Hashtable arg1 PropertyInfo arg2) { arg2.setName = ""string""; arg2.type = PropertyInfo.STRING_CLASS; arg2.setNamespace = n1; } @Override public void setProperty(int arg0 Object arg1) { this.add(arg1.toString()); }}
创建请求:
1.创建一个新的Vector-Object
StringArraySerializer stringArray = new StringArraySerializer();
2.然后再添加元素:
stringArray.add(""hello"");stringArray.add(""world"");
3.创建一个 PropertyInfo
//n0存储array namespace:String n0 = ""http://n0 ..."";stringArrayProperty = new PropertyInfo();stringArrayProperty.setName(""strarray"");stringArrayProperty.setValue(stringArray);stringArrayProperty.setType(stringArray.getClass());stringArrayProperty.setNamespace(n0);
4.给请求添加所有的属性
Request = new SoapObject(NAMESPACE METHOD_NAME);Request.addProperty(stringArrayProperty);
解决方案三:
不用楼上那么复杂吧?直接建一个实体对象,然后json序列化成字符串传到webservice,然后那边反序列化成对象。这样不方便很多吗?
时间: 2024-12-22 16:08:29