سؤال

هل لدى أي شخص مثال جيد لتنظيم الكائنات المعقدة باستخدام حزمة kSOAP؟

هل كانت مفيدة؟

المحلول

على الرغم من أن هذا المثال غير قابل للتجميع وغير كامل، إلا أن الفكرة الأساسية هي أن يكون لديك فئة تخبر kSOAP بكيفية تحويل علامة XML إلى كائن (أي.readInstance()) وكيفية تحويل كائن إلى علامة XML (أي.writeInstance()).

public class MarshalBase64File implements Marshal {

  public static Class FILE_CLASS = File.class;

  public Object readInstance(XmlPullParser parser, String namespace, String name, PropertyInfo expected)
      throws IOException, XmlPullParserException {
    return Base64.decode(parser.nextText());
  }

  public void writeInstance(XmlSerializer writer, Object obj) throws IOException {
    File file = (File)obj;
    int total = (int)file.length();
    FileInputStream in = new FileInputStream(file);
    byte b[] = new byte[4096];
    int pos = 0;
    int num = b.length;
    if ((pos + num) > total) {
      num = total - pos;
    }
    int len = in.read(b, 0, num);
    while ((len != -1) && ((pos + len) < total)) {
      writer.text(Base64.encode(b, 0, len, null).toString());
      pos += len;
      if ((pos + num) > total) {
        num = total - pos;
      }
      len = in.read(b, 0, num);
    }
    if (len != -1) {
      writer.text(Base64.encode(b, 0, len, null).toString());
    }
  }

  public void register(SoapSerializationEnvelope cm) {
    cm.addMapping(cm.xsd, "base64Binary", MarshalBase64File.FILE_CLASS, this);
  }
}

لاحقًا، عند استدعاء خدمة SOAP، ستقوم بتعيين نوع الكائن (في هذه الحالة، كائنات الملف) إلى فئة التنظيم.سوف يتطابق مغلف SOAP تلقائيًا مع نوع الكائن لكل وسيطة، وإذا لم يكن نوعًا مضمنًا، فاستدعاء المنظم المرتبط لتحويله إلى/من XML.

public class MarshalDemo {

  public String storeFile(File file) throws IOException, XmlPullParserException {
    SoapObject soapObj = new SoapObject("http://www.example.com/ws/service/file/1.0", "storeFile");
    soapObj.addProperty("file", file);

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    new MarshalBase64File().register(envelope);
    envelope.encodingStyle = SoapEnvelope.ENC;
    envelope.setOutputSoapObject(soapObj);

    HttpTransport ht = new HttpTransport(new URL(server, "/soap/file"));
    ht.call("http://www.example.com/ws/service/file/1.0/storeFile", envelope);

    String retVal = "";
    SoapObject writeResponse = (SoapObject)envelope.bodyIn;
    Object obj = writeResponse.getProperty("statusString");
    if (obj instanceof SoapPrimitive) {
      SoapPrimitive statusString = (SoapPrimitive)obj;
      String content = statusString.toString();
      retVal = content;
    }
    return retVal;
  }
}

في هذه الحالة، أستخدم ترميز Base64 لتنظيم كائنات الملف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top