Autore Topic: Problema web service, wsdl e ksoap2  (Letto 3153 volte)

Offline simoo88

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    windows 7
Problema web service, wsdl e ksoap2
« il: 11 Giugno 2011, 09:43:21 CEST »
0
Buongiorno a tutti,
vi scrivo perchè ho un problema con un web service per la mia applicazione android.
Allora io conosco solo il wsdl di questo web service, cercando in rete (prima di scrivere quì naturalmente) ho trovato molte persone che sostengono che android non supporta java.rmi quindi non posso aggiungere al mio progetto Android un semplice client web service ma devo implementare la comunicazione con il ws grazie a SOAP in particolare con KSOAP2 (una libreria apposta).
Il problema è che il webservice mette a disposizione dei metodi del tipo:

public OggettoComplesso metodo(OggettoComplesso oc);

Ksoap2 ho visto che funziona bene se al ws devo passare (grazie alla addproperty) dei parametri primitivi (int,char e nel caso anche string) ma il mio problema nasce quando devo passare degli oggetti complessi, ovvero delle classi che implementa il webservice.
L'errore che ho è una eccezione del tipo "Exception cannot serialize: OggettoComplesso", il problema credo che sia proprio perchè questi oggetti NON implementano l'interfaccia serializable (in particolare la kmvserializable) perchè chi ha realizzato il ws ha realizzato l'architettura senza pensare ad un ipotetico utilizzo per Android e quindi è stata pensata per un  utilizzo tramite JAVA.RMI e non SOAP.
Ora mi chiedo, come diavolo faccio a comunicare con questo webservice allora???
Qualcuno ha qualche idea o illuminazione, magari aiutandomi con Ksoap2???
Magari qualche tool che dato un indirizzo wsdl sia in grado di fornirmi il codice SOAP sul quale si basa Android.
Grazie a tutti e buona giornata. :D



Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Problema web service, wsdl e ksoap2
« Risposta #1 il: 11 Giugno 2011, 11:46:51 CEST »
0
Buongiorno a tutti,
vi scrivo perchè ho un problema con un web service per la mia applicazione android.
Allora io conosco solo il wsdl di questo web service, cercando in rete (prima di scrivere quì naturalmente) ho trovato molte persone che sostengono che android non supporta java.rmi quindi non posso aggiungere al mio progetto Android un semplice client web service ma devo implementare la comunicazione con il ws grazie a SOAP in particolare con KSOAP2 (una libreria apposta).
Il problema è che il webservice mette a disposizione dei metodi del tipo:

public OggettoComplesso metodo(OggettoComplesso oc);

Ksoap2 ho visto che funziona bene se al ws devo passare (grazie alla addproperty) dei parametri primitivi (int,char e nel caso anche string) ma il mio problema nasce quando devo passare degli oggetti complessi, ovvero delle classi che implementa il webservice.
L'errore che ho è una eccezione del tipo "Exception cannot serialize: OggettoComplesso", il problema credo che sia proprio perchè questi oggetti NON implementano l'interfaccia serializable (in particolare la kmvserializable) perchè chi ha realizzato il ws ha realizzato l'architettura senza pensare ad un ipotetico utilizzo per Android e quindi è stata pensata per un  utilizzo tramite JAVA.RMI e non SOAP.
Ora mi chiedo, come diavolo faccio a comunicare con questo webservice allora???
Qualcuno ha qualche idea o illuminazione, magari aiutandomi con Ksoap2???
Magari qualche tool che dato un indirizzo wsdl sia in grado di fornirmi il codice SOAP sul quale si basa Android.
Grazie a tutti e buona giornata. :D


Scusa ma se hai il wsdl di questo servizio cosa c'entra rmi?
I webservice sono fatti appositamente per essere interoperabili tra tecnologie diverse. Ovviamente non puoi generarti un client come faresti con le librerie javax.ws e devi scriverti tu a manina il codice utilizzando ksoap2.
Si tratta di cercare su internet un po' di spunti di codice. Anche qui sul forum se cerchi un po' di codice lo trovi perchè ci sono parecchie domande relative a ksoap2.

Offline simoo88

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    windows 7
Re:Problema web service, wsdl e ksoap2
« Risposta #2 il: 11 Giugno 2011, 12:53:26 CEST »
0
rmi c'entra semplicemente perchè quando genero un client webservice al progetto....
projectAndroid->new ->web service client....e aggiungo l'indirizzo wsdl....una volta che finisce la console mi restituisce l'errore:
Conversion to Dalvik format failed with error 1
proprio perchè negli stub che genera (sempre nel progetto) alcune classi usano java.rmi.
Questo è diciamo il mio primo problema.....
Come dicevo nel primo post ho già cercato in internet parecchie informazioni su Ksoap2....il mio problema in breve è questo:
molti esempi usano metodi che hanno parametri in input semplici come int,float,double ecc...
Io per comunicare con il mio webservice devo passare in input ai metodi (del webservice stesso) oggetti complessi (anche questi del webservice), in particolare classi che NON implementano l'interfaccia per la serializzazione e di conseguenza arrivo ad avere l'errore (con Ksoap2):
Exception cannot serialize: nomedellaclassedelwebservice@44db67e8

Forse ora sn stato + chiaro.....grazie per la risposta :)

Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
Re:Problema web service, wsdl e ksoap2
« Risposta #3 il: 30 Giugno 2011, 18:19:50 CEST »
0
rmi c'entra semplicemente perchè quando genero un client webservice al progetto....
projectAndroid->new ->web service client....e aggiungo l'indirizzo wsdl....una volta che finisce la console mi restituisce l'errore:
Conversion to Dalvik format failed with error 1
proprio perchè negli stub che genera (sempre nel progetto) alcune classi usano java.rmi.
Questo è diciamo il mio primo problema.....
Come dicevo nel primo post ho già cercato in internet parecchie informazioni su Ksoap2....il mio problema in breve è questo:
molti esempi usano metodi che hanno parametri in input semplici come int,float,double ecc...
Io per comunicare con il mio webservice devo passare in input ai metodi (del webservice stesso) oggetti complessi (anche questi del webservice), in particolare classi che NON implementano l'interfaccia per la serializzazione e di conseguenza arrivo ad avere l'errore (con Ksoap2):
Exception cannot serialize: nomedellaclassedelwebservice@44db67e8

Forse ora sn stato + chiaro.....grazie per la risposta :)

Non devi crearti il client con l'apposito tool,ma scriverlo a mano.Inoltre se devi passare un oggetto complesso devi crearti una classe di questo oggetto,ti faccio un esempio.Devi passare al web services una classe businessInfo composta da tre stringhe:
Codice (Java): [Seleziona]
import java.io.Serializable;
import java.util.Hashtable;

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

public class BusinessInfo implements KvmSerializable, Serializable  {
       
        private String codice;
        private String login;
        private String password;

        public BusinessInfo(String cod,String log,String pass)
        {
                codice = cod;
                login = log;
                password = pass;
               
        }

        public BusinessInfo()
        {
               
        }
       
        public String getInformation()
        {
                String ris;
                ris = "Codice" + getCodice() + "Login" + getLogin() + "Password" +getPassword();
                return ris;
        }
        public String getCodice()
        {
                return codice;
        }
       
        public void setCodice(String c)
        {
           codice = c; 
        }
       
        public String getPassword()
        {
                return password;
        }
       
        public void setPassword(String p)
        {
           password = p;       
        }
       
        public String getLogin()
        {
                return login;
        }
       
        public void setLogin(String l)
        {
           login = l;  
        }
       
          public Object getProperty(int arg0) {
               
                switch(arg0)
                {
                case 0:
                    return codice;
                case 1:
                    return login;
                case 2:
                    return password;
                }
               
                return null;
            }

            public int getPropertyCount() {
                return 3;
            }

            public void getPropertyInfo(int index, Hashtable arg1, PropertyInfo info) {
                switch(index)
                {
                case 0:
                    info.type = PropertyInfo.STRING_CLASS;
                    info.name = "Codice";
                    break;
                case 1:
                    info.type = PropertyInfo.STRING_CLASS;
                    info.name = "Login";
                    break;
                case 2:
                    info.type = PropertyInfo.STRING_CLASS;
                    info.name = "Password";
                    break;
                default:break;
                }
            }

            public void setProperty(int index, Object value) {
                switch(index)
                {
                case 0:
                    codice = value.toString();
                    break;
                case 1:
                    login = value.toString();
                    break;
                case 2:
                    password = value.toString();
                    break;
                default:
                    break;
                }
            }
       

}

Quindi devi crearti questa classe ed implementarla KvmSerializible ed anche Serializible nel caso in cui questo oggetto businessInfo dovessi passarlo ad un altra activity.Di seguito ti posto il codice per la chiamata al WS:
Codice (Java): [Seleziona]
 

       private static String SOAP_ACTION = "NAMESPACE/NOME METODO";
       private static String METHOD_NAME = "NOME DEL METODO";
       private static String NAMESPACE = "NAMESPACE DEL WS";
       private static String URL ="TUO INDIRIZZO WS";
        private Button Invia;
        private EditText Login;
        private EditText Password;
        private EditText Codice;
        boolean connesso = false;
        private TextView Result;
       
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
       
        Invia = (Button)findViewById(R.id.Invia);
        Codice = (EditText)findViewById(R.id.Codice1);
        Login = (EditText)findViewById(R.id.Login1);
        Password = (EditText)findViewById(R.id.Password1);
        Result = (TextView)findViewById(R.id.textView1);  
       
        Invia.setOnClickListener(new OnClickListener()
        {
                public void onClick(View v)
                {

                   String codice = Codice.getText().toString();  //INSERISCO I VALORI A VIDEO
                   String login = Login.getText().toString();
                   String password = Password.getText().toString();
                       
                           try {
                           //Chiamo il Metodo del WebServer
                           SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
                           Log.i("Dati inseriti","A video" + codice.toString() + login.toString() + password.toString());
                           BusinessInfo bussInfo = new BusinessInfo(codice,login,password);
                           Log.i("business","business " + bussInfo.getCodice() + bussInfo.getLogin() + bussInfo.getPassword() );
                           
                           request.addProperty("bussInfo", bussInfo);
                         
                           Log.i("addProperty","alla request" + request.getPropertyCount());
                           
                              SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
                              envelope.bodyOut = request;
                              envelope.dotNet = true;
                              envelope.setOutputSoapObject(request);
                              envelope.setAddAdornments(false);
                              envelope.implicitTypes= true;
                              Log.i("Envelope","settata");
                       
                              HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
                              envelope.addMapping(NAMESPACE, "ProdottiConcorsoPortale",new ProdottoConcorsiPortale().getClass());
                              androidHttpTransport.debug = true;
                              androidHttpTransport.call(SOAP_ACTION, envelope);
                              Log.i("","" + androidHttpTransport.requestDump);
                              Log.i("","" + androidHttpTransport.responseDump);
                                                       Log.i("call","call");
                               
                                   //Prende la risposta SOAP e ne estrae il corpo
                       
                                SoapObject resultsRequestSOAP = (SoapObject) envelope.getResponse();
                                String risultato = resultsRequestSOAP.toString();
                                Log.i("SoapObject","Result" + resultsRequestSOAP);

Sono molto importanti questi due log
Codice (Java): [Seleziona]
   Log.i("","" + androidHttpTransport.requestDump);
                              Log.i("","" + androidHttpTransport.responseDump);
per capire cosa hai mandato e cosa è stato ricevuto.

Offline winner03

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC MAGIC
  • Sistema operativo:
    Windows 7
Re:Problema web service, wsdl e ksoap2
« Risposta #4 il: 16 Settembre 2011, 23:24:48 CEST »
0
ciao,

Stò provando a chiamare un web services con input un oggetto. Ho fatto uguale a te, gli stessi passaggi e le serializzazione dell'oggetto, ma nell'input del servizio mi arriva un oggetto istanziato con i paramentri non valorizzati (le stringhe mi arrivano null, gli interi a 0).

In debug dentro l'oggetto
Codice (Java): [Seleziona]
SoapSerializationEnvelope envelope al momento della chiamata al metodo call i parametri sono valorizzati.

Dove stò sbagliando???

PS
Nel tuo esempio l'unica cosa che non ho capito è questa riga di codice
Codice (Java): [Seleziona]
envelope.addMapping(NAMESPACE, "ProdottiConcorsoPortale",new ProdottoConcorsiPortale().getClass());

Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
Re:Problema web service, wsdl e ksoap2
« Risposta #5 il: 26 Settembre 2011, 12:24:54 CEST »
0
ciao,

Stò provando a chiamare un web services con input un oggetto. Ho fatto uguale a te, gli stessi passaggi e le serializzazione dell'oggetto, ma nell'input del servizio mi arriva un oggetto istanziato con i paramentri non valorizzati (le stringhe mi arrivano null, gli interi a 0).

In debug dentro l'oggetto
Codice (Java): [Seleziona]
SoapSerializationEnvelope envelope al momento della chiamata al metodo call i parametri sono valorizzati.

Dove stò sbagliando???

PS
Nel tuo esempio l'unica cosa che non ho capito è questa riga di codice
Codice (Java): [Seleziona]
envelope.addMapping(NAMESPACE, "ProdottiConcorsoPortale",new ProdottoConcorsiPortale().getClass());

Ciao,scusami per il ritardo,se non ricordo male io dovevo passare un double al ws,e bisogna implementare un marshall che poi va segnalato con quella chiamata.Ho visto che hai messo risolto al topic,quindi credo che abbia risolto.se hai problemi posta il ws.

Offline winner03

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC MAGIC
  • Sistema operativo:
    Windows 7
Re:Problema web service, wsdl e ksoap2
« Risposta #6 il: 28 Settembre 2011, 18:28:52 CEST »
0
il tag "risolto" non l'ho messo io ma già c'era, immagino chi ha fatto il thread.

Cmq il mio codice è il seguete:

Codice (Java): [Seleziona]
    private static final String SOAP_ACTION = "[url=http://tempuri.org/IService1/Prova";]tempuri - Bing[/url]
    private static final String METHOD_NAME = "Prova";
    private static final String NAMESPACE = "[url=http://tempuri.org/";]tempuri - Bing[/url]
    private static final String URL = "http://10.0.2.2:5895/Service1.svc";
   
   
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //_______________________________________
        try {
            SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
//______________________Input____________________________________
           
            Professione professione = new Professione("IBM","Roma",true);
            request.addProperty("professione", professione);
           
           
//_____________________Fine INPUT___________________________________
           
            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
            envelope.bodyOut = request;
            envelope.dotNet = true;
            envelope.setOutputSoapObject(request);
            envelope.setAddAdornments(false);
            envelope.implicitTypes= true;


            HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
            androidHttpTransport.call(SOAP_ACTION, envelope);
//ecc.....

e la classe Professione, quella che voglio passare al mio servizio, l'ho definita così:
Codice (Java): [Seleziona]
package it.ws;

import java.io.Serializable;
import java.util.Hashtable;

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

public class Professione implements KvmSerializable, Serializable{
       
        public Professione()
        {
               
        }
        public Professione(String denominazione, String luogo, boolean spa)
        {
                this.denominazione = denominazione;
                this.luogo = luogo;
                this.spa = spa;
        }
       
        //GETTER and SETTER
       
   private String denominazione;
    private String luogo;
    private Boolean spa;
//________________________________________________

        public Object getProperty(int index) {
                switch (index) {
        case 0:
            return denominazione;
        case 1:
            return luogo;
        case 2:
            return spa;
        default:
            return null;
        }
    }

        public int getPropertyCount() {
                return 3;
        }


        public void getPropertyInfo(int index, Hashtable arg1, PropertyInfo info) {
                switch (index) {
        case 0:
                info.type = PropertyInfo.STRING_CLASS;
            info.name = "denominazione";
                break;
        case 1:
                info.type = PropertyInfo.STRING_CLASS;
                info.name = "luogo";
                break;
        case 2:
            info.type = PropertyInfo.BOOLEAN_CLASS;
            info.name = "spa";
            break;
        default:
            break;
        }      
     }

        public void setProperty(int index, Object value) {
                switch (index) {
        case 0:
            denominazione = value.toString();
            break;
        case 1:
            luogo = value.toString();
            break;
        case 2:
                spa = new Boolean(value.toString());
            break;
        default:
            break;
        }
               
        }

}

in Visual studio, dove ho messo il WS, ho definito la classe Professione in questo modo:
Codice (Java): [Seleziona]
    [DataContract]
    public class Professione
    {
        [DataMember]
        public string denominazione;

        [DataMember]
        public string luogo;

        [DataMember]
        public bool spa;
    }

Ho provato  passare un tipo primitivo e il WS l'ho riceve correttemente, mentre l'oggetto  (in questo caso Professione) arriva istanziato ma con i parametri non valorizzati.

Il Marshall non l'ho fatto, sinceramente non sò come farlo.....

Offline helldron

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
Re:Problema web service, wsdl e ksoap2
« Risposta #7 il: 05 Ottobre 2011, 11:45:05 CEST »
0
Cioè mi state dicendo che se ho un WS JAX-WS ed ho il relativo wsdl non posso autogenerare un client da Eclipse perchè Android non supporta rmi? Neanche come progetto separato che poi uso tramite il progetto Android??

Se è così è un grosso limite di Android..farsi a mano tutta la struttura del client che invece autogenerata funziona alla perfezione fa perdere tempo...

Offline winner03

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC MAGIC
  • Sistema operativo:
    Windows 7
Re:Problema web service, wsdl e ksoap2
« Risposta #8 il: 06 Ottobre 2011, 14:54:47 CEST »
0
ti quoto

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Problema web service, wsdl e ksoap2
« Risposta #9 il: 06 Ottobre 2011, 15:26:43 CEST »
0
Cioè mi state dicendo che se ho un WS JAX-WS ed ho il relativo wsdl non posso autogenerare un client da Eclipse perchè Android non supporta rmi? Neanche come progetto separato che poi uso tramite il progetto Android??

Esatto, devi fartelo a mano.

Offline helldron

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
Re:Problema web service, wsdl e ksoap2
« Risposta #10 il: 08 Ottobre 2011, 12:34:22 CEST »
0
Volevo ringraziare Dom4 per aver postato il codice sull'uso semplice e preciso delle ksoap2. Con questo sono riuscito in poco tempo a far funzioare una chiamata ad un WS JAX-WS in poco tempo.