如何使用kso​​ap2将String数组传递给webservice?

时间:2011-08-20 09:16:26

标签: android web-services android-ksoap2

我使用ksoap2在Android中安装了Web客户端,但我无法将字符串数组作为参数传递给Web服务。

这是我的代码

String[] items={"hello","world"};
request.addproperty("str",items);

2 个答案:

答案 0 :(得分:11)

首先使用“soapUI”查看正确的请求结构(如项目名称,项目名称空间,......)。 我们假设你想在请求中写这样的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 stores 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);

参考:

ksoap2-android,CodingTipsAndTricks

答案 1 :(得分:0)

就像你应该逐个添加它。

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;
        }
    }