Autore Topic: SOAP Client per android  (Letto 7006 volte)

Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
SOAP Client per android
« il: 20 Maggio 2010, 09:45:15 CEST »
0
Salve ragazzi,ho bisogno del vostro aiuto.Per la mia tesi di laurea sto sviluppando un client per Android,che deve invocare dei metodi da wsdl.Sto riscontrando molti problemi,vi posto il codice.
Codice (Java): [Seleziona]
public class Client extends Activity
{

       
           
          private String SOAP_ACTION = "http://WSGeoEAR-WSGeoServer/getAllPositions";
          private String METHOD_NAME = "getAllPositions";
          private String NAMESPACE = "http://WSGeoEAR-WSGeoServer/";
          private static final String URL ="http://192.41.218.56:8080/WSGeoEAR-WSGeoServer/NavFinderBean?WSDL";
         
         
              /** Called when the activity is first created. */
              @Override
              public void onCreate(Bundle icicle) {
                  super.onCreate(icicle);
                  setContentView(R.layout.main);
               
                  ((TextView)findViewById(R.id.lblStatus)).setText("1");  

                //Chiamo il Metodo del WebServer
                 SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
                 /*SoapObject parameters = new SoapObject(NAMESPACE,"getAllPositionsResponse");          
                 parameters.addProperty("idUtente",1);
                 request.addProperty(METHOD_NAME,parameters);    
             */

                  request.addProperty("idUtente",1);
                   
                  SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
                  envelope.dotNet = true;
                  envelope.setOutputSoapObject(request);
             
           
                  HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
           
               
                  try {
                  androidHttpTransport.call(SOAP_ACTION, envelope);
                 
                  //Prende la risposta SOAP e ne estrae il corpo
                  SoapObject resultsRequestSOAP = (SoapObject) envelope.bodyIn;
                 
                  ArrayList<Position> resultData = (ArrayList<Position>)resultsRequestSOAP.getProperty("getAllPositionsResponse");
               
                  for(Position p : resultData)
                  {
                         
                      ((TextView)findViewById(R.id.lblStatus)).setText(p.getAllInformation());  
                  }        
                        } catch(Exception E) {
                              ((TextView)findViewById(R.id.lblStatus)).setText("ERROR:" + E.getClass().getName() + ": " + E.getMessage());
                            }
                          }
                                 
                  }

Classe Position
Codice (Java): [Seleziona]
public class Position  implements java.io.Serializable {
    private long idPosition;

    private int idUtente;

    private double latitudine;

    private double longitudine;

    private long timeInserted;

    public Position() {
    }

    public Position(
           long idPosition,
           int idUtente,
           double latitudine,
           double longitudine,
           long timeInserted) {
           this.idPosition = idPosition;
           this.idUtente = idUtente;
           this.latitudine = latitudine;
           this.longitudine = longitudine;
           this.timeInserted = timeInserted;
    }


    /**
     * Gets the idPosition value for this Position.
     *
     * @return idPosition
     */

    public long getIdPosition() {
        return idPosition;
    }


    /**
     * Sets the idPosition value for this Position.
     *
     * @param idPosition
     */

    public void setIdPosition(long idPosition) {
        this.idPosition = idPosition;
    }


    /**
     * Gets the idUtente value for this Position.
     *
     * @return idUtente
     */

    public int getIdUtente() {
        return idUtente;
    }


    /**
     * Sets the idUtente value for this Position.
     *
     * @param idUtente
     */

    public void setIdUtente(int idUtente) {
        this.idUtente = idUtente;
    }


    /**
     * Gets the latitudine value for this Position.
     *
     * @return latitudine
     */

    public double getLatitudine() {
        return latitudine;
    }


    /**
     * Sets the latitudine value for this Position.
     *
     * @param latitudine
     */

    public void setLatitudine(double latitudine) {
        this.latitudine = latitudine;
    }


    /**
     * Gets the longitudine value for this Position.
     *
     * @return longitudine
     */

    public double getLongitudine() {
        return longitudine;
    }


    /**
     * Sets the longitudine value for this Position.
     *
     * @param longitudine
     */

    public void setLongitudine(double longitudine) {
        this.longitudine = longitudine;
    }


    /**
     * Gets the timeInserted value for this Position.
     *
     * @return timeInserted
     */

    public long getTimeInserted() {
        return timeInserted;
    }


    /**
     * Sets the timeInserted value for this Position.
     *
     * @param timeInserted
     */

    public void setTimeInserted(long timeInserted) {
        this.timeInserted = timeInserted;
    }

    public String getAllInformation()
    {
        return "IdPosition " + getIdPosition() + "IdUtente " + getIdUtente() + "longitudine " + getLongitudine() + "latitudine " + getLatitudine() + "timeInserted" + getTimeInserted();
    }
    }

E vi allego la risposta
Potete aiutarmi a capire dove sbaglio??
« Ultima modifica: 20 Maggio 2010, 11:00:58 CEST da Qlimax »

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:SOAP Client per android
« Risposta #1 il: 20 Maggio 2010, 14:04:21 CEST »
0
Ciao dom4,

ho visto che hai provato a chiedere la stessa cosa su anddev.org e su How to connect to a SOAP webServices with Android - Stack Overflow 
Siamo proprio la tua ultima speranza  :-o ?

Allora...ho provato un attimo la libreria ksoap2 e visto che non avevo voglia di crearmi un webservice, sono andato a prenderne uno pubblico.
ecco il webservice che ho testato:

Service-Repository: OrteLookup

questo è il wsdl di quel servizio

http://mathertel.de/AJAXEngine/S02_AJAXCoreSamples/OrteLookup.asmx?WSDL   (fai view source nella pagina)

questa è la envelope di richiesta per il metodo "OrteStartWith" con parametro prefix "an":
Codice (XML): [Seleziona]
<s11:Envelope xmlns:s11="http://schemas.xmlsoap.org/soap/envelope/">
  <s11:Body>
    <ns1:OrteStartWith xmlns:ns1="http://www.mathertel.de/OrteLookup/">
      <ns1:prefix xmlns:ns1="http://www.mathertel.de/OrteLookup/">an</ns1:prefix>
    </ns1:OrteStartWith>
  </s11:Body>
</s11:Envelope>

e questa la risposta:
Codice (XML): [Seleziona]
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <OrteStartWithResponse xmlns="http://www.mathertel.de/OrteLookup/">
      <OrteStartWithResult>Andechs;Andernach;Andervenne;Angelbachtal;Angelburg, Hess;Anger b Bad Reichenhall;Angermünde;Anhausen, Kr Neuwied;Anklam;Ankum</OrteStartWithResult>
    </OrteStartWithResponse>
  </soap:Body>
</soap:Envelope>


il seguente, è il codice di un'activity che ho creato per chiamare il metodo "OrteStartWith" sul servizio  (il metodo restituisce le citta tedesche presenti nel db, che iniziano con il parametro "prefix" passato)

Codice (Java): [Seleziona]
public class SoapClient extends Activity {
    /** Called when the activity is first created. */
        private static final String SOAP_ACTION = "http://www.mathertel.de/OrteLookup/OrteStartWith";
    private static final String METHOD_NAME = "OrteStartWith";
    private static final String NAMESPACE = "http://www.mathertel.de/OrteLookup/";
    private static final String URL = "http://mathertel.de/AJAXEngine/S02_AJAXCoreSamples/OrteLookup.asmx";
    TextView tv;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        tv=(TextView)findViewById(R.id.result);

       try {

            SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

            PropertyInfo propertyInfo=new PropertyInfo();
            propertyInfo.setName("prefix");
            propertyInfo.setValue("be");
            propertyInfo.setNamespace(NAMESPACE);
           
            request.addProperty(propertyInfo);
               
           
            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
            envelope.dotNet=true;
            envelope.setOutputSoapObject(request);
           

            HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

            androidHttpTransport.call(SOAP_ACTION, envelope);
 

            SoapPrimitive result=(SoapPrimitive)envelope.getResponse();

            String resultData=result.toString();
           

            tv.setText(resultData);
        } catch (Exception e) {
                tv.setTextColor(Color.RED);
            tv.setText(e.toString());
            }
    }

}

funziona. Ti allego il progetto O:-)

Se fai un "merge" del materiale che ti ho fornito con il tuo, sono sicuro che risolverai il problema .


Saluti,
Qlimax


Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
Re:SOAP Client per android
« Risposta #2 il: 20 Maggio 2010, 15:41:51 CEST »
0
Ciao Qlimax,
intanto grazie per la risposta.Avevo dimenticato che c'era questo forum in italiano..Ma per fortuna vi ho ritrovati..Ti volevo chiedere:ma i due file xml,dove li devo mettere nel progetto??ho visto anche in quello che mi hai allegato,ma non ci sono.

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:SOAP Client per android
« Risposta #3 il: 20 Maggio 2010, 16:03:06 CEST »
0
Se non sai dove vanno quei file xml, forse è il caso di approfondire la tua conoscenza sui web service SOAP.
Ti consiglio di documentarti a fondo prima di implementare un'applicazione che utilizza questo tipo di architettura.


ps:quelli sono i messaggi xml che si scambiano client e service

Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
Re:SOAP Client per android
« Risposta #4 il: 21 Maggio 2010, 12:23:09 CEST »
0
Se non sai dove vanno quei file xml, forse è il caso di approfondire la tua conoscenza sui web service SOAP.
Ti consiglio di documentarti a fondo prima di implementare un'applicazione che utilizza questo tipo di architettura.


ps:quelli sono i messaggi xml che si scambiano client e service

So che la mia cultura su SOAP non è il massimo,e di certo approfondirò lo studio,ancor di più di quanto stia già facendo,avevo già creato a una response in xml,però credimi,nonostante tutti i tutorial che abbia letto,non sono riuscito a capire come richiamarla.Ho provato a metterla nel progetto android,ma senza risultati..Il WS che sto utilizzando,non l'ho creato io,lo sto solo interrogando,quindi se mi spieghi per favore cosa dovrei fare di preciso,te ne sarei veramente grato..

Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
Re:SOAP Client per android
« Risposta #5 il: 16 Giugno 2010, 12:09:09 CEST »
0
Ciao Qlimax,
ho fatto un merge come da te suggerito,però la risposta che ricevo è sempre la stessa.Quella che ho allegato,secondo te è un problema della mia classe Position,perchè nella segnalazione dell'errore si parla di un position:END_TAG etc..
Sinceramente non riesco a capire a cosa si riferisca,ho provato il tuo esempio e funziona correttamente..Siccome devo ricevere un complex type forse non o impostato bene la classe..

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:SOAP Client per android
« Risposta #6 il: 17 Giugno 2010, 00:31:10 CEST »
0
la tua Classe Position è solo una classe container. sicuramente non è colpa di questa classe il non funzionamento del tuo client.

prova a postare uno zip del tuo progetto, così è anche piu comodo poterti aiutare.

Ciao


Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
Re:SOAP Client per android
« Risposta #7 il: 17 Giugno 2010, 19:27:23 CEST »
0
Ecco il codice completo..

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:SOAP Client per android
« Risposta #8 il: 17 Giugno 2010, 21:50:30 CEST »
0
ma sei sicuro che il web service funzoni?

prova qui:

Web Soap Client






« Ultima modifica: 17 Giugno 2010, 21:53:13 CEST da Qlimax »

Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
Re:SOAP Client per android
« Risposta #9 il: 19 Giugno 2010, 12:08:32 CEST »
0
Il Web Services è momentaneamente fuori uso.Lunedì lo riattivo.Ti faccio sapere quando lo riavvio.

Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
Re:SOAP Client per android
« Risposta #10 il: 21 Giugno 2010, 15:12:00 CEST »
0
ma sei sicuro che il web service funzoni?

prova qui:

Web Soap Client

Ora funziona..

Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
Re:SOAP Client per android
« Risposta #11 il: 29 Giugno 2010, 11:07:21 CEST »
0
Qlimax mi è venuta un'idea,ma non so se è applicabile.E se creassi il client staccato da android,poi importo la classe Client.java nel progetto Android?secondo te funzionerebbe?

Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
Re:SOAP Client per android
« Risposta #12 il: 21 Gennaio 2011, 11:38:09 CET »
0
Nel mio codice,ho messo dei log.i,come valori sentinella,praticamente si blocca a questa chiamata
androidHttpTransport.call(SOAP_ACTION, envelope);
envelope la prende quindi potrebbe essere un errore della SOAP_ACTION,forse sbaglio a dichiararla,hai qualche suggerimento?

Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
Re:SOAP Client per android
« Risposta #13 il: 21 Marzo 2011, 11:55:49 CET »
0
Nel mio codice,ho messo dei log.i,come valori sentinella,praticamente si blocca a questa chiamata
androidHttpTransport.call(SOAP_ACTION, envelope);
envelope la prende quindi potrebbe essere un errore della SOAP_ACTION,forse sbaglio a dichiararla,hai qualche suggerimento?

Risolto parzialmente il problema,delle variabili andavano settate in modo differente.
Praticamente ora riesco ad effettuare la chiamata e ottenere la risposta,ma questa risposta è vuota.
Perchè questo?
Questo è il codice rivisitato:
Codice (Java): [Seleziona]
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.AndroidHttpTransport;
import org.ksoap2.transport.HttpTransportSE;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class SOAP2 extends Activity {

       
           
    private static String SOAP_ACTION = "http://session/getAllPositions";
    private static String METHOD_NAME = "getAllPositions";
    private static String NAMESPACE = "http://session/";
    //private static String URL ="http://192.41.218.56:8080/WSGeoEAR-WSGeoServer/NavFinderBean?WSDL";
    private static String URL ="http://192.41.218.56:8080/WSGeoEAR-WSGeoServer/NavFinderBean";
   TextView tv;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        tv=(TextView)findViewById(R.id.result);
        try {
       
       Log.i("Invio request","1");
      //Chiamo il Metodo del WebServer
       SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
       
        Log.i("PROPERTYINFO","2");
          PropertyInfo propertyInfo=new PropertyInfo();
          propertyInfo.setName("idUtente");
          propertyInfo.setValue(1);
          propertyInfo.setNamespace(NAMESPACE);
         
          request.addProperty(propertyInfo);
          Log.i("Aggiunte le proprietà alla request","3");
       
          SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
          envelope.dotNet = true;
          envelope.setOutputSoapObject(request);
          Log.i("ENVELOPE SETTATA","4");
     
          HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
          Log.i("Trasport url","5");
          androidHttpTransport.call(SOAP_ACTION, envelope);
          Log.i("Envelope inviata","6");
        //Prende la risposta SOAP e ne estrae il corpo
     
            SoapObject resultsRequestSOAP =  (SoapObject) envelope.bodyIn;
            Log.i("Ricevuta risposta","7");
   
           
  String res = resultsRequestSOAP.toString();
  Log.i("Metto la risposta nella var res","8");
  ((TextView)findViewById(R.id.lblStatus)).setText(res.toString()
                );
     
                ((TextView)findViewById(R.id.lblStatus)).setText(resultsRequestSOAP.toString());
               
           
  Log.i("STAMPO A VIDEO","9");
           }catch(Exception E) {
        ((TextView)findViewById(R.id.lblStatus)).setText("ERROR:" + E.getClass().getName() + ": " + E.getMessage());
            Log.i("Stampo errore","9");
          }
        }


}

Allego anche il logcat

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:SOAP Client per android
« Risposta #14 il: 22 Marzo 2011, 22:16:17 CET »
0
Ma sei sicuro che il servizio funziona correttamente? Ho dei dubbi al riguardo.
Esiste già un altro client? Se si, hai il codice?

Riguardo al fatto di testare il servizio fuori da android. Certo che puoi, anzi te lo consiglio, cosi risparmi anche tempo.
Basta che usi classi che puoi usare anche su android.