Pregunta

i wish to generate a soap request like :

<soapenv:Body>
    -
    <Perform xmlns="eras.in">
        -
        <request>
            <ActionName>Connect</ActionName>
            -
            <Input xmlns:ns1="eras.in" xsi:type="ns1:Record">
                <ns1:EntityName>Credential</ns1:EntityName>
                -
                <ns1:Fields>
                    -
                    <ns1:Field>
                        <ns1:Key>DomainName</ns1:Key>
                        <ns1:Value xsi:type="ns2:guid"
                            xmlns:ns2="http://schemas.microsoft.com/2003/10/Serialization/">Check2</ns1:Value>
                    </ns1:Field>
                    -
                    <ns1:Field>
                        <ns1:Key>UserName</ns1:Key>
                        <ns1:Value xsi:type="ns3:guid"
                            xmlns:ns3="http://schemas.microsoft.com/2003/10/Serialization/">utsav</ns1:Value>
                    </ns1:Field>
                    -
                    <ns1:Field>
                        <ns1:Key>Password</ns1:Key>
                        <ns1:Value xsi:type="ns4:guid"
                            xmlns:ns4="http://schemas.microsoft.com/2003/10/Serialization/">xxxxx</ns1:Value>
                    </ns1:Field>
                </ns1:Fields>
            </Input>
        </request>
    </Perform>
</soapenv:Body>

But I am able to generate something like :

<v:Body>
    <Perform xmlns="eras.in">
        <request i:type="n0:ActionRequest" xmlns:n0="eras.in">
            <ActionName i:type="d:string">Connect</ActionName>
            <sessionId i:null="true" />
            <Input i:type="n0:Record">
                <EntityName i:type="d:string">Credential</EntityName>
                <RecordId i:null="true" />
                <Fields i:type="n0:Fields">
                    <Field i:type="n0:Field">
                        <Key i:type="d:string">DomainName</Key>
                        <Value i:type="d:string">Check2</Value>
                    </Field>
                    <Field i:type="n0:Field">
                        <Key i:type="d:string">UserName</Key>
                        <Value i:type="d:string">utsav</Value>
                    </Field>
                    <Field i:type="n0:Field">
                        <Key i:type="d:string">Password</Key>
                        <Value i:type="d:string">xxx</Value>
                    </Field>
                </Fields>
            </Input>
        </request>
    </Perform>
</v:Body>

At the server when I check I see that Fields array is a null object.

Can somepne please help?

I suspect in the serverside object there is an array of type Field named Fields. Whereas i send a vector object named as Fields. Is this causing a problem?

Or is it because the field tags are missing the namespace prefix?

Thanks and Regards.

My Java code is :

       SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
       SoapSerializationEnvelope envelope = new        SoapSerializationEnvelope(SoapEnvelope.VER11);
      ActionRequest ERequest = new ActionRequest();
      ERequest.setActionName("Connect");
      Record r = new Record();
      r.setEntityName("Credential");
      Fields fs = new Fields();
      fs.add(new Field("DomainName","Check2"));
      fs.add(new Field("UserName","utsav"));
      fs.add(new Field("Password","xxxx"));
      r.setFields(fs);
      ERequest.setInput(r);
      request.addProperty("request",ERequest);
      envelope.setOutputSoapObject(request);
  envelope.dotNet = true;
  envelope.setAddAdornments(false);
  envelope.implicitTypes = true;
  envelope.addMapping(NAMESPACE, "ActionRequest", new ActionRequest().getClass());
  envelope.addMapping(NAMESPACE, "Record", new Record().getClass());
  envelope.addMapping(NAMESPACE, "Field", new Field().getClass());

ActionRequest.java:

        package com.example.eat;

        import java.util.Hashtable;
        import org.ksoap2.serialization.KvmSerializable;
        import org.ksoap2.serialization.PropertyInfo;



     public class ActionRequest  implements KvmSerializable  {


private java.lang.String ActionName;

    private java.lang.Object input;

    private java.lang.String sessionId;

     public java.lang.String getActionName() {
    return ActionName;
}

public void setActionName(java.lang.String actionName) {
    this.ActionName = actionName;
}

public java.lang.Object getInput() {
    return input;
}

public void setInput(java.lang.Object input) {
    this.input = input;
}

public java.lang.String getSessionId() {
    return sessionId;
}

public void setSessionId(java.lang.String sessionId) {
    this.sessionId = sessionId;
}



public ActionRequest() {
}

@Override
public Object getProperty(int arg0) {
    // TODO Auto-generated method stub
    switch (arg0) {
    case 0:
        return ActionName;
    case 1:
         return sessionId;
    case 2: 
         return input;
    default:
        break;
    }
    return null;
}

@Override
public int getPropertyCount() {
    // TODO Auto-generated method stub
    return 3;
}

@Override
public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo info) {
    // TODO Auto-generated method stub
     switch (arg0) {
        case 0:
            info.type = PropertyInfo.STRING_CLASS;
            info.name = "ActionName";
            break;
        case 1:
            info.type = PropertyInfo.STRING_CLASS;
            info.name = "sessionId";
            break;
        case 2:
            info.type = Object.class;
            info.name = "Input";
            break;
        default:
            break;
        }

}

@Override
public void setProperty(int index, Object value) {
    // TODO Auto-generated method stub
    switch (index) {
    case 0:
        this.ActionName =value.toString();
        break;
    case 1:
        this.sessionId = value.toString();
        break;
    case 2:
        this.input =  value;
    default:
        break;
    }       
}

}

Record.Java:

package com.example.eat;

import java.util.Hashtable;

import org.ksoap2.serialization.KvmSerializable;
import org.ksoap2.serialization.PropertyInfo;

public class Record  implements KvmSerializable {
    private java.lang.String EntityName;
    private java.lang.String RecordId;
    private Fields Fields1 = new Fields();
    //Field[] fs = new Field[0];

    public  com.example.eat.Fields getFields() {
        return Fields1;
    }

    public void setFields(Fields f) {
        this.Fields1 = f;
    }

    public java.lang.String getEntityName() {
        return EntityName;
    }

    public void setEntityName(java.lang.String entityName) {
        this.EntityName = entityName;
    }

    public java.lang.String getRecordId() {
        return RecordId;
    }

    public void setRecordId(java.lang.String recordId) {
        this.RecordId = recordId;
    }







    public Record() {
    }

    public Record(
           java.lang.String entityName,
           Fields fields,
           java.lang.String recordId) {
           this.EntityName = entityName;
           this.Fields1 = fields;
           this.RecordId = recordId;
    }

    @Override
    public Object getProperty(int arg0) {
        // TODO Auto-generated method stub
         switch (arg0) {
            case 0:
                return EntityName;
            case 1:
                return RecordId;
            case 2: 
                return Fields1;
            default:
                break;
            }
            return null;

    }

    @Override
    public int getPropertyCount() {
        // TODO Auto-generated method stub
        return 3;
    }

    @Override
    public void getPropertyInfo(int index, Hashtable arg1, PropertyInfo info) {
        // TODO Auto-generated method stub
        switch (index) {
        case 0:
            info.type = PropertyInfo.STRING_CLASS;
            info.name = "EntityName";
            break;
        case 1:
            info.type = PropertyInfo.STRING_CLASS;
            info.name = "RecordId";
            break;
        case 2:
            info.type = this.Fields1.getClass();
            info.name = "Fields";
            break;
        default:
            break;
        }
    }

    @Override
    public void setProperty(int index, Object value) {
        // TODO Auto-generated method stub

        if(null == value)
            value = "";
        switch (index) {
        case 0:
            EntityName = value.toString();
            break;
        case 1:
            RecordId= value.toString();
            break;
        case 2:
            Fields1= (Fields) value;
            break;


    }


    }

}

Fields.java

package com.example.eat;

import java.util.Hashtable;
import java.util.Vector;

import org.ksoap2.serialization.KvmSerializable;
import org.ksoap2.serialization.PropertyInfo;

public class Fields extends Vector <Field> implements KvmSerializable{

    @Override
    public Object getProperty(int arg0) {
        // TODO Auto-generated method stub
         return this.get(arg0);
    }

    @Override
    public int getPropertyCount() {
        // TODO Auto-generated method stub
        return this.size();
    }

    @Override
    public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) {
        // TODO Auto-generated method stub
        arg2.name = "Field";
       // arg2.type = PropertyInfo.STRING_CLASS;
         arg2.type = new Field().getClass();

    }

    @Override
    public void setProperty(int arg0, Object arg1) {
        // TODO Auto-generated method stub
         this.add((Field)arg1);
    }

}

Field.java:

package com.example.eat;

import java.util.Hashtable;
import java.util.Vector;

import org.ksoap2.serialization.KvmSerializable;
import org.ksoap2.serialization.PropertyInfo;

/**
 * Field.java
 *
 * This file was auto-generated from WSDL
 * by the Apache Axis 1.4 Apr 22, 2006 (06:55:48 PDT) WSDL2Java emitter.
 */

public class Field   implements KvmSerializable {
    private java.lang.String key;

    private java.lang.Object value;

    public Field(String key, String value) {
        // TODO Auto-generated constructor stub
        this.key=key;
        this.value=value;
    }

    public Field() {
        // TODO Auto-generated constructor stub
    }

    @Override
    public Object getProperty(int arg0) {
        // TODO Auto-generated method stub
        switch (arg0){
        case 0:
            return key;
        case 1:
            return value;
        default:
            return null;
        }
    }

    @Override
    public int getPropertyCount() {
        // TODO Auto-generated method stub
        return 2;
    }

    @Override
    public void getPropertyInfo(int index, Hashtable arg1, PropertyInfo info) {
        // TODO Auto-generated method stub

        switch (index) {
        case 0:
            info.type = PropertyInfo.STRING_CLASS;
            info.name = "Key";
            break;
        case 1:
            info.type = Object.class;
            info.name = "Value";
            break;

        default:
            break;
        }

    }

    @Override
    public void setProperty(int index, Object value) {
        // TODO Auto-generated method stub
        if(null == value)
            value = "";
        switch (index) {
        case 0:
            key = value.toString();
            break;
        case 1:
            this.value = value;
            break;

        }
    }


}
¿Fue útil?

Solución

It is much easier to use SoapObject for arrays in ksoap as you get better control over the namespaces. An example for eras service connect request is shown below ...

private static final String NAMESPACE = "eras.in" ;
private static final String URL = "https://eras.in/Host/";
private static final String SOAP_ACTION = "eras.in/IActionService/Perform";
private static final String METHOD_NAME = "Perform";

public static void main(String[] args) {

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
    SoapObject actionRequest = new SoapObject(NAMESPACE, "ActionRequest");

    request.addProperty("request", actionRequest);
    actionRequest.addProperty("ActionName", "Connect");

    SoapObject record = new SoapObject(NAMESPACE, "Record");
    actionRequest.addProperty("Input", record);

    record.addProperty("EntityName", "Credential");

    SoapObject fields = new SoapObject(NAMESPACE, "ArrayOfField");
    record.addProperty("Fields", fields);

    SoapObject domain = new SoapObject(NAMESPACE, "Field");
    domain.addProperty("Key", "DomainName");
    domain.addProperty("Value", "<your domain name>");
    fields.addSoapObject(domain);

    SoapObject user = new SoapObject(NAMESPACE, "Field");
    user.addProperty("Key", "UserName");
    user.addProperty("Value", "<your username>");
    fields.addSoapObject(user);

    SoapObject pwd = new SoapObject(NAMESPACE, "Field");
    pwd.addProperty("Key", "Password");
    pwd.addProperty("Value", "<your password>");
    fields.addSoapObject(pwd);

    envelope.setOutputSoapObject(request);
    envelope.dotNet = true;

    HttpTransportSE httpTransport = new HttpTransportSE(URL);
    try
    {
        httpTransport.call(SOAP_ACTION, envelope);
        SoapObject response = (SoapObject)envelope.getResponse();
        System.out.println(response.toString());
    }
    catch(Exception e)
    {   
        e.printStackTrace();
    }
}   

Notice the line

SoapObject fields = new SoapObject(NAMESPACE, "ArrayOfField");
record.addProperty("Fields", fields);

Where Fields is the property of Record class and the type of this property is an array of Field, that is:

class Record
{
    Field[] Fields;
    ...
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top