Как передать массив строк в веб-сервис с помощью ksoap2?

У меня есть веб-клиент на Android, использующий ksoap2, но я не могу передать массив строк в качестве параметра веб-сервису.

Вот мой код

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

person user903575    schedule 20.08.2011    source источник


Ответы (2)


Сначала используйте «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>

расширить класс из вектора:

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

person hasanghaforian    schedule 23.11.2011
comment
Вам нужно обобщить эти примеры в своем ответе, иначе он, вероятно, будет удален. Если ссылка не работает, то и этот ответ :) - person Tim Post♦; 23.11.2011
comment
Какое пространство имен я должен поместить в n1 и n0 ?? - person Vivek Singh; 06.08.2013
comment
@VivekSingh Самый простой способ: используйте SoapUI и посмотрите правильный запрос. Там вы можете найти пространства имен. - person hasanghaforian; 06.08.2013
comment
@hasanghaforian: мне нужна твоя помощь, пожалуйста. обратитесь по этой ссылке http://stackoverflow.com/questions/19198017/pass-arraylist-data-into-soap-web-service-in-android как передать данные массива в службу SOAP? - person Harshal Kalavadiya; 09.10.2013
comment
этот способ подходит и для HashMap? - person Saeid; 08.07.2014
comment
@ saeid. Я не пробовал HashMap, но если вы прочитаете ссылку в конце ответа, вы увидите, что это возможно. - person hasanghaforian; 08.07.2014

это похоже на то, что вы должны добавить его один за другим.

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;
        }
    }
person Li Che    schedule 10.12.2012