2 o casper ne O_Casper_ne 于 2012.12.07 17:33 提问

使用ksoap2传递字符串数组到webservice

在android程序中有一个Web Client使用ksoap2,但是还是不能把字符串数组作为一个参数传递到webservice中。
贴出相关代码:

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

请求大家的帮忙,谢谢!

3个回答

franzhong
franzhong   2012.12.08 13:37
已采纳

好像只能一条条加

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

不知此类对你是否有参考价值

myq_26
myq_26   2012.12.10 14:12

首先使用"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);
yhxi1234
yhxi1234 请问服务端接口怎么写的?public void test(Vector<String> s);这么写收不到参数啊。。。
大约 3 年之前 回复
fire_fire_fire
fire_fire_fire   Rxr 2012.12.17 14:12

不用楼上那么复杂吧?直接建一个实体对象,然后json序列化成字符串传到webservice,然后那边反序列化成对象。这样不方便很多吗?

suannai0314
suannai0314 如果您是想评论回答可以直接在回答下边点击添加评论。如果是回答,请参看http://ask.csdn.net/pages/how_to_answer
大约 5 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!