2015-11-10 4 views
0

Я пытаюсь отправить массив сложных объектов из клиента android в мою службу WCF. Я использовал http://seesharpgears.blogspot.ru/2010/10/web-service-that-returns-array-of.html в качестве примера для получения массива сложных объектов, и это работает нормально. Но я не могу понять, как отправить этот массив.ksoap2 Отправка массива сложных объектов в службу WCF

Я использую kmvserializable для объекта: RatingHttps общественного класса реализует KvmSerializable {

public int CIsso; 

public int RatingIsso; 

public long RatingDate; 

public String RatingExt; 

public RatingHttps() {super();} 

public RatingHttps(int CIsso, int RatingIsso, long RatingDate, String RatingExt) { 
    this.CIsso = CIsso; 
    this.RatingIsso = RatingIsso; 
    this.RatingDate = RatingDate; 
    this.RatingExt = RatingExt; 
} 

@Override 
public Object getProperty(int i) { 
    Object property = null; 
    switch (i) { 
     case 0: 
      property = this.CIsso; 
      break; 
     case 1: 
      property = this.RatingDate; 
      break; 
     case 2: 
      property = this.RatingExt; 
      break; 
     case 3: 
      property = this.RatingIsso; 
      break; 
    } 
    return property; 
} 

@Override 
public int getPropertyCount() { 
    return 4; 
} 

@Override 
public void setProperty(int i, Object o) { 
    switch (i) { 
     case 0: 
      this.CIsso = Integer.parseInt(o.toString()); 
      break; 
     case 1: 
      this.RatingDate = Long.parseLong(o.toString()); 
      break; 
     case 2: 
      this.RatingExt = o.toString(); 
      break; 
     case 3: 
      this.RatingIsso = Integer.parseInt(o.toString()); 
      break; 

    } 
} 
private static final String NAMESPACE = "http://schemas.datacontract.org/2004/07/Ais7UpdateServer"; 

@Override 
public void getPropertyInfo(int i, Hashtable hashtable, PropertyInfo propertyInfo) { 
    switch (i) { 
     case 0: 
      propertyInfo.type = PropertyInfo.INTEGER_CLASS; 
      propertyInfo.name = "CIsso"; 
      propertyInfo.setNamespace(NAMESPACE); 
      break; 
     case 1: 
      propertyInfo.type = PropertyInfo.LONG_CLASS; 
      propertyInfo.name = "RatingDate"; 
      propertyInfo.setNamespace(NAMESPACE); 
      break; 
     case 2: 
      propertyInfo.type = PropertyInfo.STRING_CLASS; 
      propertyInfo.name = "RatingExt"; 
      propertyInfo.setNamespace(NAMESPACE); 
      break; 
     case 3: 
      propertyInfo.type = PropertyInfo.INTEGER_CLASS; 
      propertyInfo.name = "RatingIsso"; 
      propertyInfo.setNamespace(NAMESPACE); 
      break; 
     default: break; 
    } 
} 

Это, как я использую его:

List<RatingHttps> ratings = new ArrayList<>(); 
     RatingHttps rating = new RatingHttps(); 
     rating.CIsso = 1; 
     rating.RatingIsso = 2; 
     rating.RatingExt = "LOL"; 
     rating.RatingDate = 3; 
     ratings.add(rating); 
     rating = new RatingHttps(); 
     rating.CIsso = 10; 
     rating.RatingIsso = 20; 
     rating.RatingExt = "OLOLO"; 
     rating.RatingDate = 30; 
     ratings.add(rating); 
      //cr.moveToNext(); 


     //request = GetSoapObject(METHOD_NAME[2]); 
     request = new SoapObject(NAMESPACE, METHOD_NAME[2]); 

     //envelope = GetEnvelope(request); 
     request.addProperty("id", resultId.toString()); 
     //PropertyInfo pi = new PropertyInfo(); 
     //pi.setName("ratings"); 
     //pi.setValue(ratings); 
     //pi.setType(ratings.getClass()); 

     //request.addProperty(pi); 
     request.addProperty("ratings", ratings); 

     //envelope.addMapping(NAMESPACE, ratings.getClass().getSimpleName(), ratings.getClass()); 
     envelope.addMapping(NAMESPACE, "ArrayOfRatingHttps", RatingHttps.class); 
     SoapObject count = (SoapObject) SecureConnect(SOAP_ACTION[2], request, envelope); 

SecureConnect:

private Object SecureConnect(String soapAction, SoapObject request, SoapSerializationEnvelope envelope) { 
    try { 
     if(request != null) { 
      envelope.setOutputSoapObject(request); 
      envelope.dotNet = true; 
     } 
     HttpsTransportSE androidHttpsTransport = new HttpsTransportSE(host, port, subFile, 20000); 
     androidHttpsTransport.call(soapAction, envelope); 
     return envelope.getResponse(); 
    } catch (Exception e) { 
     result = e.toString(); 
     Log.d("Tag", "Ошибка: " + e.toString()); 
     return null; 
    } 
} 

I попробовал с массивами, например Rating [] .. И с Vector, но это не сработает. Я не знаю, что делать! Может быть, у кого-нибудь есть примеры, как это сделать? Пожалуйста помоги.

ответ

0

После многих часов поиска через Интернет, я наконец нашел рабочий пример. Если у вас возникнет такая же проблема, убедитесь, что вы отправляете правильный xml-файл. Во-первых, я сопоставлял xml-файл, который мне приходилось получать, с файлом xml на сервере. Когда я узнал, что они были такими же, я обнаружил ошибку в тегах, и я покажу, как я это сделал в коде: Мой класс RatingHttps такой же, как в моем вопросе; Init мой класс, например:

List<RatingHttps> rating = new ArrayList<>(); 
     RatingHttps ratings = new RatingHttps(); 
     ratings.CIsso = 1; 
     ratings.RatingIsso = 2; 
     ratings.RatingExt = "LOL"; 
     ratings.RatingDate = 3; 
     rating.add(ratings); 

Далее, запрос:

request = new SoapObject(NAMESPACE, METHOD_NAME[2]); 
     SoapObject ratingRequest = new SoapObject(NAMESPACE, "ArrayOfRatingHttps"); 
     request.addProperty("id", resultId.toString()); 
     PropertyInfo pi = new PropertyInfo(); 
     pi.setName("ratings"); 
     pi.setValue(ratingRequest); 
     pi.setType("ArrayOfRatingHttps"); 
     request.addProperty(pi); 

     for(int i = 0; i < rating.size(); i++) { 
      SoapObject rate = new SoapObject(RatingHttps.NAMESPACE, RatingHttps.class.getSimpleName()); 

      //Добавляем значения RatingHttps в xml запрос 
      rate.addProperty(getPropInfo(rating.get(i).getAttributeName(0), rating.get(i), rating.get(i).getAttributeType(0))); 
      rate.addProperty(getPropInfo(rating.get(i).getAttributeName(1), rating.get(i), rating.get(i).getAttributeType(1))); 
      rate.addProperty(getPropInfo(rating.get(i).getAttributeName(2), rating.get(i), rating.get(i).getAttributeType(2))); 
      rate.addProperty(getPropInfo(rating.get(i).getAttributeName(3), rating.get(i), rating.get(i).getAttributeType(3))); 

      ratingRequest.addSoapObject(rate); 
     } 
     envelope.addMapping(NAMESPACE, RatingHttps.class.getSimpleName(), RatingHttps.class); 
HttpsTransportSE androidHttpsTransport = new HttpsTransportSE(host, port, subFile, 20000); 
     androidHttpsTransport.call(soapAction, envelope); 

где "ArrayOfRatingHttps" я нашел для массива в моем файле XSD. Если у вас есть услуга wcf, вы можете найти ее в своем адресном «https://your_address?xsd=xsd2». Кроме того, я понял функцию getPropInfo, вот код:

private PropertyInfo getPropInfo(String name, RatingHttps rating, Object type) { 
    PropertyInfo pi = new PropertyInfo(); 
    pi.setName(name); 
    pi.setValue(rating.getCIsso()); 
    pi.setType(type); 
    pi.setNamespace(RatingHttps.NAMESPACE); 
    return pi; 
} 

где NAMESPACE я нашел также в XSD-файл для моей службы в качестве TargetNamespace. так вот, теперь я могу отправить массив сложных объектов. Надеюсь, что это поможет кому-нибудь ...

Смежные вопросы