Autore Topic: Soap web service su differenti versioni  (Letto 712 volte)

Offline Bito92

  • Utente junior
  • **
  • Post: 51
  • Respect: +7
    • Mostra profilo
Soap web service su differenti versioni
« il: 03 Febbraio 2012, 11:26:35 CET »
0
ciao a tutti,
comincio con il scusarmi per il titolo del topic, perchè magari non e molto chiaro.

Vi spiego brevemente il problema, ho creato un applicazione che utilizza dei web service per fare diverse operazioni, il problema sta principalmente nel fatto che nelle versioni 2.1 e 2.3 rispettivamente con le api di google, le chiamate al ws non danno nessun problema.

Provando invece con versioni 3.2 o 4.0 sempre con google api, crasha tutto rilevando un "nullpointerexception".

Spero che qualcuno riesca ad aiutarmi  :-)

Vi ringrazio in anticipo :-)

Offline Bito92

  • Utente junior
  • **
  • Post: 51
  • Respect: +7
    • Mostra profilo
Re:Soap web service su differenti versioni
« Risposta #1 il: 03 Febbraio 2012, 11:29:11 CET »
0
Mi sono accorto di aver sbagliato sezione  :-( chiedo scusa a tutti  :-(

Offline rhllor

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Google+
    • amule
    • Mostra profilo
  • Dispositivo Android:
    Lg P500
  • Sistema operativo:
    Ubuntu 11.10
Re:Soap web service su differenti versioni
« Risposta #2 il: 03 Febbraio 2012, 11:32:32 CET »
0
Hai controllato il log?
Come effettui la chiamata al Web-service?
Hai usato delle librerie libere o roba tua?

senza informazioni è difficile darti una mano.
D'interessante c'è che, secondo gli astronomi moderni, lo spazio è finito. È un pensiero confortante, specie per chi non ricorda mai dove ha lasciato gli occhiali.

Offline Bito92

  • Utente junior
  • **
  • Post: 51
  • Respect: +7
    • Mostra profilo
Re:Soap web service su differenti versioni
« Risposta #3 il: 03 Febbraio 2012, 11:52:55 CET »
0
Questo è il log:

I/System.out( 1697): cwsa result null
D/AndroidRuntime( 1697): Shutting down VM
W/dalvikvm( 1697): threadid=1: thread exiting with uncaught exception (group=0x40014760)
E/AndroidRuntime( 1697): FATAL EXCEPTION: main
E/AndroidRuntime( 1697): java.lang.NullPointerException
E/AndroidRuntime( 1697):        at com.seven.app.main.checkAuth(main.java:276)
E/AndroidRuntime( 1697):        at com.seven.app.main$3.onClick(main.java:107)
E/AndroidRuntime( 1697):        at android.view.View.performClick(View.java:3110)
E/AndroidRuntime( 1697):        at android.view.View$PerformClick.run(View.java:11934)
E/AndroidRuntime( 1697):        at android.os.Handler.handleCallback(Handler.java:587)
E/AndroidRuntime( 1697):        at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime( 1697):        at android.os.Looper.loop(Looper.java:132)
E/AndroidRuntime( 1697):        at android.app.ActivityThread.main(ActivityThread.java:4123)
E/AndroidRuntime( 1697):        at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 1697):        at java.lang.reflect.Method.invoke(Method.java:491)
E/AndroidRuntime( 1697):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
E/AndroidRuntime( 1697):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
E/AndroidRuntime( 1697):        at dalvik.system.NativeStart.main(Native Method)
W/ActivityManager(   73):   Force finishing activity com.seven.app/.main

la chiamata al ws presente nel log e questa:

Codice (Java): [Seleziona]
public boolean checkAuth(){
                boolean check = false;
                WebService cws = new WebService();
               
                sdb = new sevenDb(getBaseContext());
        sdb.open();
        String codfis = sdb.getParams("CODFISCALE");
        String targa  = sdb.getParams("TARGA");
        String codcli = sdb.getParams("CODCLIENTE");
        sdb.close();
               
        if (codfis != null || targa != null || codcli != null){
                cws.setSoapAction("[url=http://tempuri.org/WSmobile/Service1/getConducente"]tempuri - Bing[/url]);
                    cws.setMethodName("getConducente");
                    cws.setNameSpace("[url=http://tempuri.org/WSmobile/Service1"]tempuri - Bing[/url]);
                    cws.setUrl("[url=http://www.carserver.it/WSmobile/service1.asmx?WSDL"]WSmobile Servizio Web[/url]);
                   
                    String authValue[] = new String[4];
                    authValue[0] = codfis;
                    authValue[1] = targa;
                    authValue[2] = "";
                    authValue[3] = codcli;
                   
                    String authLabel[] = new String[4];
                    authLabel[0] = "CodFis";
                    authLabel[1] = "Targa";
                    authLabel[2] = "NumTel";
                    authLabel[3] = "CodCli";
                   
                    SoapSerializationEnvelope response =  cws.start(authLabel, authValue);
                    SoapObject response2 = (SoapObject) response.bodyIn; ---->: riga 276
                    if (response != null) {
                                /* Controllo se sono stati passati dei valori validi */
                                if (response2.getProperty(0).toString().equals("Non autenticato") ||
                                                response2.getProperty(0).toString() == null){
                                        check = false;
                                }else{
                                        check = true;
                                }
                        }else{
                                check = false;
                        }
        }else{
                check = false;
        }
                       
                return check;
        }

e questa e la classe addetta alla chiamata del ws:

Codice (Java): [Seleziona]
public class WebService {
       
        private static String SOAP_ACTION ;
        private static String METHOD_NAME;
        private static String NAMESPACE ;
        private static String URL;
       
        /* Costruttore */
        public WebService(){}
       
        /* Soap Actcion */
        public void setSoapAction(String SoapAction) {
                SOAP_ACTION = SoapAction;
        }
        public String getSoapAction() {
                return SOAP_ACTION;
        }
       
        /* Method Name */
        public void setMethodName(String MethodName){
                METHOD_NAME = MethodName;
        }
        public String getMethodName(){
                return METHOD_NAME;
        }
       
        /* NameSpace */
        public void setNameSpace(String NameSpace){
                NAMESPACE = NameSpace;
        }
        public String getNameSpace(){
                return NAMESPACE;
        }
       
        /* Url */
        public void setUrl(String Url){
                URL = Url;
        }
        public String getUrl(){
                return URL;
        }
       
    /*
     * Questa funzione fa partire la chiamata al web service di tipo SOAP, il secondo parametro sono i parametri del ws,
     * il terzo, invece, gli header
     */

    public SoapSerializationEnvelope start(String NomeParametro, Object parametri, String[] headerPropertyLabel, String[] headerPropertyList) {
                /* Creo oggetto SOAP che effettua la chiamata alla funzione di tipo Soap */
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
       
        /* Gestisco i parametri che gli devo passare */
        if (parametri != null) {
                PropertyInfo pi = new PropertyInfo();
            pi.setName("input");
            pi.setValue(parametri);
            pi.setType(parametri.getClass());
            request.addProperty(pi);
        }
       
       
        /* Configuro la chiamata per un SOAP .NET  */
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet=true;
       
        /* Controllo se ci sono gli header, se ci sono li passo e li genero */
        if (headerPropertyList != null) {
                envelope.headerOut = new Element[1];
            envelope.headerOut[0] = buildAuthHeader(headerPropertyLabel, headerPropertyList);
       }
       
       
        envelope.setOutputSoapObject(request);
        if (parametri != null) {
                envelope.addMapping(NAMESPACE, NomeParametro, parametri.getClass());
        }
       
        MarshalDate md = new MarshalDate();
        md.register(envelope);
       
        MarshalDouble mb = new MarshalDouble();
        mb.register(envelope);
       
        MarshalBase64 marshal = new MarshalBase64();
        marshal.register(envelope);
       
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
       
        /* try per cattura eccezioni */
        try {
                /* Effetto Chiamata in base ai parametri passati */
                androidHttpTransport.call(SOAP_ACTION, envelope);  ----> il problema parte da qui
        }
        catch(SocketException ex){
                System.out.println("cws result "+ex.getMessage());
                return null;
        }
        catch (Exception e) {
                System.out.println("cwsa result "+e.getMessage());
                return null;
        }
        return envelope;
    }
   
    /* Funzioni Wrapper della start*/
    public SoapSerializationEnvelope start(String NomeParametro, Object parametri) {
        return start(NomeParametro, parametri, null, null);
    }
   
    public SoapSerializationEnvelope start(String[] headerPropertyLabel, String[] headerPropertyList) {
        return start(null, null, headerPropertyLabel, headerPropertyList);
    }
   
    public SoapSerializationEnvelope start() {
        return start(null, null, null, null);
    }
    /* Fine Funzioni Wrapper */
   
    /* Questa funzione si occupa di generare l'header per l'autenticazione */
    private Element buildAuthHeader(String[] headerPropertyLabel, String[] headerPropertyList) {
        Element h = new Element().createElement(NAMESPACE, "AuthHeader");
       
        /* Ciclo Array ed appendo l'elemento creato */
        int i     = headerPropertyLabel.length;
        int index = 0;
        while (index < i) {
                Element elemento = new Element().createElement(NAMESPACE,headerPropertyLabel[index]);
                elemento.addChild(Node.TEXT, headerPropertyList[index]);
            h.addChild(Node.ELEMENT, elemento);
           
            index++;
        }
       
        /* ritorno l'header */
        return h;
    }

}

ho una libreria libera.

Offline rhllor

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Google+
    • amule
    • Mostra profilo
  • Dispositivo Android:
    Lg P500
  • Sistema operativo:
    Ubuntu 11.10
Re:Soap web service su differenti versioni
« Risposta #4 il: 03 Febbraio 2012, 11:59:08 CET »
0
Dalla 3.0 in poi le richieste di questo genere devono essere eseguite su un Thread diverso da quello dell'applicazione. Attualmente fai eseguire tutto nello stesso thread quindi in modo sincrono. Devi lavorare in modo Asincrono su due thread separati, quando quello del Web-service ha finito di lavorare si occuperà di aggiornare il thread originale.

Utilizza, per esempio, la classe AsyncTask per fare questo.
D'interessante c'è che, secondo gli astronomi moderni, lo spazio è finito. È un pensiero confortante, specie per chi non ricorda mai dove ha lasciato gli occhiali.

Offline Bito92

  • Utente junior
  • **
  • Post: 51
  • Respect: +7
    • Mostra profilo
Re:Soap web service su differenti versioni
« Risposta #5 il: 08 Febbraio 2012, 10:04:06 CET »
0
grazie mille, grazie alla classe asynctask sono riuscito a far funzionare tutto  ;-)