Отправьте массив <String>в веб-службу, используя KSOAP2 - PullRequest
0 голосов
/ 25 октября 2019

У меня проблема с моим проектом Android, использующим KSOAP2. Я хотел бы отправить определение нового тега в веб-сервисы. Я получил метод AddNewDetection в моих веб-сервисах. Я положил рис описание функции. У меня есть эта ошибка

 W/System.err:     at org.ksoap2.serialization.SoapSerializationEnvelope.writeElement(SoapSerializationEnvelope.java:784)
 W/System.err:     at org.ksoap2.serialization.SoapSerializationEnvelope.writeProperty(SoapSerializationEnvelope.java:764)
 W/System.err:     at org.ksoap2.serialization.SoapSerializationEnvelope.writeObjectBody(SoapSerializationEnvelope.java:688)
 W/System.err:     at org.ksoap2.serialization.SoapSerializationEnvelope.writeObjectBodyWithAttributes(SoapSerializationEnvelope.java:664)
 W/System.err:     at org.ksoap2.serialization.SoapSerializationEnvelope.writeElement(SoapSerializationEnvelope.java:777)
W/System.err:     at org.ksoap2.serialization.SoapSerializationEnvelope.writeBody(SoapSerializationEnvelope.java:634)
 W/System.err:     at org.ksoap2.SoapEnvelope.write(SoapEnvelope.java:205)
W/System.err:     at org.ksoap2.transport.Transport.createRequestData(Transport.java:161)
W/System.err:     at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:149)
 W/System.err:     at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:118)
W/System.err:     at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:113)
 W/System.err:     at com.example.patrickrogerapp.common.QueryUtils.sendData(QueryUtils.kt:118)`

Я должен передать в веб-службу массив строк. И я не могу это сделать. Я использую Kotlin 1.3.50 и KSOAP2 3.6.4

Я пробовал разные способы, такие как использование ArrayList, ... Я не нашел решения своей проблемы.

Заранее спасибоза любую помощь!

    fun AddNewDetection(detectionDateTime : DateTime, idAction : int, idBox: int?, idProduit : int?, idShop: int?, numberList: Array<String>): Void

fun sendData(action: Int, idBox:Int?, idProduct: Int, idShop: Int, tags: Array<String>): SoapSerializationEnvelope {
        SOAP_ACTION = "http://tempuri.org/IStelStockService/AddNewDetection"

        val envelope = SoapSerializationEnvelope(SoapEnvelope.VER11)
        val request = SoapObject(NAMESPACE, "AddNewDetection")
        envelope.implicitTypes = true

        val pi = PropertyInfo()
        pi.setName("dectectionDateTime")
        pi.type = MarshalDate::class.java
        pi.value = Date(System.currentTimeMillis())
        MarshalDate().register(envelope)
        request.addSoapObject(SoapObject().addProperty(pi))

        request.addProperty("idAction", action)
        request.addProperty("idBox", idBox)
        request.addProperty("idProduit", idProduct)
        request.addProperty("idShop", idShop)
        request.addProperty("numberList", tags)

        val item = PropertyInfo()
        item.setType(Array<String>::class.java)
        item.setName("numberList")
        item.value = tags
        request.addProperty(item)

        envelope.dotNet = true
        envelope.setOutputSoapObject(request)

        val httpTransport = HttpTransportSE(URL)
        try {
            // This is the actual part that will call the webservice by setting the desired
            // header SOAP Action header field.
            httpTransport.call(SOAP_ACTION, envelope)
            Log.d("PR_DEBUG", envelope.response.toString())
        } catch (e: IOException) {
            // Many kinds of exceptions can be caught here
            Log.e(LOG_TAG, e.toString())
            e.printStackTrace()
        } catch (e: XmlPullParserException) {
            e.printStackTrace()
        }
        return envelope

    }`

1 Ответ

0 голосов
/ 29 октября 2019

Я нашел решение. Мне нужно было создать класс, который расширяет Vector и реализует KvmSerializable. Затем установите для пространства имен значение "http://schemas.microsoft.com/2003/10/Serialization/Arrays".

Вот мой класс:

public class StringArraySerializer extends Vector<String> implements KvmSerializable {
//n1 stores item namespaces:
String n1 = "http://schemas.microsoft.com/2003/10/Serialization/Arrays";

@Override
public Object getProperty(int arg0) {
    return this.get(arg0);
}

@Override
public int getPropertyCount() {
    return this.size();
}

@Override
public void setProperty(int arg0, Object arg1) {
    this.add(arg1.toString());
}

@Override
public void getPropertyInfo(int i, Hashtable hashtable, PropertyInfo propertyInfo) {
    propertyInfo.setName("string");
    propertyInfo.setType(PropertyInfo.STRING_CLASS);
    propertyInfo.setNamespace(n1);
}

}

И вот как я добавляю массив строк винформация о недвижимости:

val list = StringArraySerializer()
    list.add("aaa")
    list.add("bb")
    val propertyInfo = PropertyInfo()
    propertyInfo.setName("numberList")
    propertyInfo.value = list
    propertyInfo.type = StringArraySerializer::class.java
...