2012-09-05 2 views
2

J'ai un .net webservice, où je dois envoyer un param (type de dateTime), comme vous pouvez le voir:Comment envoyer DateTime à .net webService à partir d'Android (ksoap2)?

<startDateTime>dateTime</startDateTime> 

Dans client Android, j'utilise ksoap2, et je ne sais pas, Comment envoyer ce type de données? S'il vous plaît aider avec réglage de ce type - code ci-dessous ne fonctionne pas.

PropertyInfo propInfo3 = new PropertyInfo(); 
propInfo3.name="startDateTime"; 
propInfo3.value="2012-02-01"; 

Répondre

0

Sur votre serveur, quel est le retour du client?

Lorsque j'ai un problème comme celui-ci, je montre dans le Logcat sur Android ce que j'envoie et dans le côté serveur ce que je reçois. J'ai eu un petit problème avec la date aussi (j'utilise ksoap2 et webservices), je résous mon problème en envoyant la date dans util.Date, puis j'utilise SimpleDateFormat avec une date de modèle dans mon projet et convertis cette chaîne à ce que je veux.

cya, Bertan


Voici mon code qui envoie à WS:

public static byte[] send(String... param) throws SocketTimeoutException, IOException, XmlPullParserException, Exception{ 
      //First I send the WS Name 
    String ws = param[0]; 
      //Second is the operationName 
    SoapObject soap = new SoapObject(URL_SOAP, param[1]); 

    Object retorno = null; 

    int tamParam = param.length; 

      //The 3 parameter for the infinity its the properties, name and the next it's the value... 
    if (tamParam > 0) { 
     for (int i = 2; i < tamParam; i++) { 
      soap.addProperty(param[i], param[++i]); 
     } 
    } 

    // create a envelope for the soap object 
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
    envelope.setOutputSoapObject(soap); 

    // create a HttpTransport to send the object soap with 15s delay 
    MyHttpTransport httpTransport = new MyHttpTransport(URL + ws, 15000); 

    // send the req 
    Long tempo1 = 0l; 
     tempo1 = System.currentTimeMillis(); 
     httpTransport.call("", envelope); 

     retorno = envelope.getResponse(); 
     Long tempo2 = System.currentTimeMillis(); 

    httpTransport.reset(); 
    //I ever get byte[] from the WS... 
    if (retorno != null) { 
     byte[] bloc = Base64.decode(retorno.toString(), Base64.DEFAULT); 
     return bloc; 
    } else { 
     return null; 
    } 
} 
+0

Merci pour la réponse, Pouvez-vous coller votre code - Comment vous passez des valeurs à ProperyInfo objet? Ive réponse de ws, mais les données sont vides (pas de résultats), mais j'ai un message de savon - donc je suppose, que les paramètres ne sont pas correctement mis en place :( –

+0

J'espère que cela peut vous aider: D –

+0

merci, mais ... ws id .NET? Je ne vois pas "envelope.dotNet = true" ... Deuxièmement, vous utilisez: soap.addProperty (param [i], param [++ i]); , donc son semblable à ceci: propInfo3. name = "startDateTime"; QU'EN EST-IL DU type de configuration? propInfo3.value = "2012-02-01"; –

4

Voici comment j'appelle les méthodes de service Web dans ma demande. Notez la méthode que j'ai utilisée pour convertir les dates java. Vous avez besoin d'un format de date ISO.

protected static Object callMethod(String method, Map<String, Object> parameters) throws IOException, XmlPullParserException { 
    SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE, method); 

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
    envelope.dotNet = true; 
    envelope.headerOut = new Element[1]; 
    envelope.headerOut[0] = buildAuthHeader(); 
    envelope.setOutputSoapObject(request); 
    if (parameters != null) { 
     for (String item : parameters.keySet()) { 
      Object itemValue = parameters.get(item); 
      if (itemValue.getClass().getName().equals("java.util.Date")) { 
       // If it's a date then we have to format it because ksoap 
       // does not know how to do this. 
       request.addProperty(item, getSOAPDateString((java.util.Date) itemValue)); 
      } else { 
       request.addProperty(item, itemValue); 
      } 
     } 
    } 

    HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS, 10000); 
    httpTransport.debug = true; 

    httpTransport.call(WSDL_TARGET_NAMESPACE + "/" + method, envelope); 
    String soapString = httpTransport.requestDump; 
    System.out.println(soapString); 
    return envelope.getResponse(); 
} 

Voici la méthode qui retourne la chaîne réelle:

private static Object getSOAPDateString(java.util.Date itemValue) { 
    String lFormatTemplate = "yyyy-MM-dd'T'hh:mm:ss'Z'"; 
    DateFormat lDateFormat = new SimpleDateFormat(lFormatTemplate); 
    String lDate = lDateFormat.format(itemValue); 

    return lDate; 
} 
+0

Est-ce que cette solution fonctionne pour vous? Je reçois le "SoapFault - faultcode: 'soap: Serveur' faultstring: 'Le serveur n'a pas pu traiter la requête ---> Référence d'objet non définie sur une instance d'un objet.' faultactor: 'null' detail: [email protected] " Votre format produira également un" Z "à la fin? Je crois que vous devriez utiliser "aaaa-MM-dd'T'HH: mm: ss.SSSZ" – Mafro34

+0

Depuis, je suis passé aux services JSON, mais cela a fonctionné parfaitement pour moi au cours de quelques mois. Mon service .net a accepté les dates dans ce format.Avez-vous déjà débogué l'appel de service sur votre service .Net? La référence d'objet .. est définitivement une erreur .Net. – Tjaart

+1

Je faisais quelque chose d'immensément stupide (appelant une méthode similaire qui ne prenait pas de dateTime). Dans ma quête pour résoudre ce problème et avant que je réalise que j'ai appris à utiliser la classe MarshalDate fournie et que je l'utilise maintenant. – Mafro34

Questions connexes