Вложенные свойства внутри тега в Ksoap2

1

Привет, я хочу сделать запрос на мыло, используя выше soap xml

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:sap-com:document:sap:soap:functions:mc-style">
   <soapenv:Header/>
   <soapenv:Body>
      <urn:AvailCheck>
         <IUvail>
            <Unit>PC</Unit>
            <Qty>3000</Qty>
         </IUvail>
      </urn:AvailCheck>
   </soapenv:Body>
</soapenv:Envelope>

Поэтому я создал код с использованием библиотеки ksoap. я создал объект для soapobject

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

и добавил свойства, подобные этому

request.addProperty("Unit", "PC");
request.addProperty("Qty", "3000");

но проблема в том, что я не могу добавить <IUvail> в requset.. Так как я могу добавить это?

Теги:
ksoap2
android-ksoap2

3 ответа

8
Лучший ответ

Вы можете передать сложный объект (IUvail) следующим образом:

IUvail.java

import java.util.Hashtable;

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

public class IUvail implements KvmSerializable {
    private String unit;
    private int qty;

public IUvail() {}

public IUvail(String unit, int qty) {
    this.unit = unit;
    this.qty = qty;
}

public void setUnit(String unit) { this.unit = unit; }
public void setQty(int qty) { this.qty = qty;}
public String getUniy() { return unit;}
public int getQty() { return qty;}

public Object getProperty(int arg0) {
    switch(arg0) {
        case 0:
            return unit;
        case 1:
            return qty;
     }
     return null;
}

public int getPropertyCount() {
    return 2;
}

public void getPropertyInfo(int index, Hashtable arg1, PropertyInfo propertyInfo) {
    switch(index){
        case 0:
            propertyInfo.name = "unit";
            propertyInfo.type = PropertyInfo.STRING_CLASS;
            break;
        case 1:
            propertyInfo.name = "qty";
            propertyInfo.type = PropertyInfo.INTEGER_CLASS;
            break;
        default:
            break;
    }
}

public void setProperty(int index, Object value) {
    switch(index) {
        case 0:
            this.unit = value.toString();
            break;
        case 1:
            this.qty = Integer.parseInt(value.toString());
            break;
        default:
            break;
   }
}  }

затем

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
IUvail iuvail = new IUvail();
iuvail.setUnit("PC");
iuvail.setQty(3000);
request.addProperty("IUvail", iuvail);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
            SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
envelope.addMapping(TARGET_NAMESPACE, "IUvail", new IUvail.getClass());

AndroidHttpTransport transport = new AndroidHttpTransport(URL);
try {
    transport.call(NAMESPACE + METHOD_NAME, envelope);
    /* Get the response: it depends on your web service implementation */
} catch (Exception e) {
    e.printStackTrace();
}

Где NAMESPACE, URL, METHOD_NAME и TARGET_NAMESPACE зависят от вашего ws.

  • 0
    привет спасибо за ваш ответ ........... отличный ответ
  • 1
    Вы можете сказать мне, что должно быть NAMESPACE?
Показать ещё 3 комментария
1

У меня была та же проблема (доступ к веб-сервису SAP с Android). Существует простое решение:

request.addProperty("IUvail", "<Unit>PC</Unit><Qty>3000</Qty>");

Весь доступ с аутентификацией:

String USER = "user";
String PASSWORD = "pwd";
String NAMESPACE_SOAP = "http://schemas.xmlsoap.org/soap/envelope/";
String NAMESPACE_SAP = "urn:sap-com:document:sap:rfc:functions";
String SOAP_ACTION = "http://server:port/webservice_root";
String METHOD_NAME = "AvailCheck";

SoapObject request = new SoapObject(NAMESPACE_SAP, METHOD_NAME);
request.addProperty("IUvail", "<Unit>PC</Unit><Qty>3000</Qty>");

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
        SoapEnvelope.VER11);
envelope.env = NAMESPACE_SOAP;
envelope.dotNet = false;
envelope.setOutputSoapObject(request);

HttpTransportSE androidHttpTransport = new HttpTransportSE(
        SOAP_ACTION);
androidHttpTransport.debug = true;
try {
    List<HeaderProperty> headerList = new ArrayList<HeaderProperty>();
    headerList.add(new HeaderProperty("Authorization", "Basic "
            + org.kobjects.base64.Base64
                    .encode((USER + ":" + PASSWORD).getBytes())));
    androidHttpTransport.call(SOAP_ACTION, envelope, headerList);
    // SoapObject response = (SoapObject) envelope.getResponse();
    // response.getProperty(0).toString();
    // Object response = envelope.getResponse();
    SoapPrimitive result = (SoapPrimitive) envelope.getResponse();
    Log.d("webservice", "Result: " + result.toString());
} catch (Exception e) {
    e.printStackTrace();
    Log.e("WebserviceException", e.getMessage(), e);
    Log.d("WebserviceException", "[requestDump] "
            + androidHttpTransport.requestDump);
    Log.d("WebserviceException", "[responseDump] "
            + androidHttpTransport.responseDump);
}
-1

попробуйте сделать что-то подобное,

SoapObject request = new SoapObject(NAMESPACE,
                            METHOD_NAME);

                    request.addProperty("username", username);
                    request.addProperty("username", password);

                    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                            SoapEnvelope.VER11);
                    envelope.dotNet = true;
                    envelope.setOutputSoapObject(request);
                    HttpTransportSE androidHttpTransport = new HttpTransportSE(
                            URL);
                try {
                        androidHttpTransport.call(SOAP_ACTION, envelope);
                    } catch (IOException ioex) {
                            ioex.printStackTrace();
                    }
  • 0
    привет ... я уже сделал это ... но моя проблема в том, как я могу поместить все свойства внутри <iUvail>. Здесь METHOD_NAME - это «Проверить». Таким образом, мы не можем передать это как метод

Ещё вопросы

Сообщество Overcoder
Наверх
Меню