2010-11-15 72 views
2

J'ai testé l'appel d'un soap 12 webservices avec ksoap2. J'ai utilisé ce code pour appeler le webservice:Y at-il un problème avec ksoap2 et savon Version 12?

SoapObject request = new SoapObject(NAMESPACE, NAME); 
request.addProperty("id", ID); 
request.addProperty("name", "[email protected]"); 
request.addProperty("pw", "password"); 
request.addProperty("listid", 501); 

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12); 
envelope.setOutputSoapObject(request); 

AndroidHttpTransport client = new AndroidHttpTransport(URL); 
try { 
    client.call(NAMESPACE + NAME, envelope); 
    Object response = envelope.getResponse(); 
} catch (IOException e) { 
    Log.e(getClass().getSimpleName(), "IO Problem", e); 
} catch (XmlPullParserException e) { 
    Log.e(getClass().getSimpleName(), "Parser Problem", e); 
} 

Je reçois maintenant l'exception suivante:

org.xmlpull.v1.XmlPullParserException:expected: START_TAG {http://www.w3.org/2001/12/soap-envelope}Envelope (position:START_TAG <{http://schemas.xmlsoap.org/soap/envelope/}soapenv:Envelope>@1:114 in java.io.I[email protected]) 

Est-ce un problème de la réponse du serveur ou est-il quelque chose de mal dans mon code à ce jour? Il semble que les autres utilisateurs ont le même problème. Si je change l'Enveloppe en SoapEnvelope.VER11 je vais un peu plus loin (je reçois une réponse d'accès refusé du serveur de savon probablement à cause d'une mauvaise URL) peut-être qu'il manque des informations supplémentaires pour créer une enveloppe VER12.

+0

Qu'est-ce que vous voulez dire que vous allez encore plus loin avec v11? Recevez-vous réellement une réponse appropriée en arrière? –

+0

Je reçois une permission refusée par le service de savon. Cela semble être un problème avec l'utilisation d'url im et pas la bibliothèque de ksoap. – Janusz

+2

PermissionDenied est 99% parce que vous n'avez pas fourni dans votre AndroidManifest – Taras

Répondre

4

Avez-vous essayé les différentes options de votre enveloppe pour voir ce que les services attend?

E.g. vous pouvez définir

envelope.dotNet = true; 
envelope.headerOut = security; // this is an Element[] created before 
envelope.encodingStyle = SoapEnvelope.ENC; 
envelope.setAddAdornments(false); 
envelope.implicitTypes = false; 

et un tas de plus. Découvrez le javadoc?

Assurez-vous également d'utiliser la dernière version du projet ksoap2-android pour obtenir un ensemble de correctifs qui ne figurent pas dans le projet normal sourceforge.

+2

Problème encore non résolu mais la prime est sur le point d'expirer. Donc, je vais vous le donner comme une récompense pour vos efforts sur ksoap sur android. Merci pour la seule solution de travail pour communiquer avec une API de savon. – Janusz

+0

Thx. Il peut s'agir d'essayer d'utiliser une configuration différente du côté serveur. J'espère que vous avez le contrôle. –

+0

Merci! vraiment aidé: D enfin! Par ailleurs, ce qui m'a aidé à changer la version SOAP de SOAP12 à SOAP11 + ces paramètres fournis par Manfred Moser – manWe

0

Essayez VR11 et remplacer votre

Object response = envelope.getResponse(); 

avec

SoapObject reponse=(SoapObject)envelope.getResponse(); 
+0

qui ne fait pas la différence –

-2

J'ai eu le même problème, j'ai continué à obtenir une exception "Permission Denied" de envelop.getResponse.

J'ai supposé que quelque chose n'allait pas avec ma demande SOAP et j'ai essayé un certain nombre de changements dans l'enveloppe. Finalement, après avoir regardé à travers d'autres conseils, j'ai réalisé que j'avais besoin d'une autorisation supplémentaire pour Android pour permettre cela.

Ajoutez donc l'autorisation suivante au manifeste de votre application Android.

<uses-permission android:name="android.permission.INTERNET"> 
+1

erreur mentionnée dans la question est différente de ce que vous fournissez réellement la solution ... – DeltaCap

1

Ce que je l'ai fait pour faire ce travail était la version utilisation 11, et il a bien fonctionné pour moi :-)

 // Request model 
     SoapObject request = new SoapObject(namespace, Metodo); 

     // Envelop model 
     SoapSerializationEnvelope sobre = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
     sobre.dotNet = true; 
     sobre.setOutputSoapObject(request); 

     // Transport model 
     HttpTransportSE transporte = new HttpTransportSE(url); 

     // Let's call it :) 
     transporte.call(accionSoap, sobre); 

     //Result 
     SoapPrimitive resultado = (SoapPrimitive) sobre.getResponse(); 

     tv.setText("" + resultado.toString()); 

Mes variables:

private static final String accionSoap = "http://tempuri.org/ServicioAndroid"; 
private static final String Metodo = "ServicioAndroid"; 
private static final String namespace = "http://tempuri.org/"; 
private static final String url = "http://192.168.1.33/AutoEPOC_H/WS/WSAutoEPOC.asmx"; 

Ce service Web a été créé usin dotNet. Vous pouvez vérifier votre méthode, votre action, votre espace de noms et votre URL en exécutant votre service Web à l'aide d'IIS.

Si vous comprenez l'espagnol, vous pouvez vérifier ces liens:

http://www.youtube.com/watch?v=_MMByNiwqMc

http://programa-con-google.blogspot.com/2010/12/android-como-consumir-un-servicio-web.html

J'espère que cela aide!

0

J'utilise ksoap2 ver11 seulement ... encore il me donne une erreur expected start_tag quand je l'utilise sur un autre serveur autre que localhost.

Mes services web sont parfaitement hébergés par le serveur de mon entreprise mais ils donnent cette erreur de début de balise attendue dans l'émulateur Android 2.2 et n'affichent rien (erreur nulle) dans le toast.

Je ne suis pas sûr, mais il peut être l'exception «NetworkOnMainThread» dans le téléphone (Android 4.0).