Autore Topic: Problema Web Service  (Letto 1621 volte)

Offline OmarLuigi

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Tab
  • Sistema operativo:
    Windows 7
Problema Web Service
« il: 02 Maggio 2011, 16:34:08 CEST »
0
Il codice dovrebbe effettuare un login ad un Web Service remoto. Ve lo posto:

Codice (Java): [Seleziona]
package omar.WebService;
import omar.WebService.R;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransport;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class WebService extends Activity
{        private static final String SOAP_ACTION = "http://www.mustcoursemaker.net/WebServices/GetTicket"; //preso dall'xml
     private static final String METHOD_NAME = "GetTicket"; //nome del metodo
     private static final String NAMESPACE = "urn:http://www.mustcoursemaker.net/WebServices/"; //preso dall'xml
     private static final String URL = "[url=http://www.mustcoursemaker.net/direct/webservices/wslogin.asmx?wsdl";]
        wsLogin Web Service
[/url] //url all'xml
     
     private Button   Invia;
         private EditText UserID;
         private EditText LangID;
         private EditText Password;
         private TextView Result;
         private TextView TicketID;

     public void onCreate(Bundle icicle)
         {      super.onCreate(icicle);
                setContentView(R.layout.main);
               
                //Variabili corrispondenti ad elementi grafici
                Invia=(Button)findViewById(R.id.Invia);
                UserID=(EditText)findViewById(R.id.UserID);
                LangID=(EditText)findViewById(R.id.LangID);
                Password=(EditText)findViewById(R.id.Password);
                Result=(TextView)findViewById(R.id.Result);
                TicketID=(TextView)findViewById(R.id.TicketID);
               
                // Listener del button Invia
                Invia.setOnClickListener(new OnClickListener()
                {       public void onClick(View v)
                        {      
                                // CREO LA BUSTA SOAP, specificando che le proprietà che si imposteranno sono riferibili a NAMESPACE
                                // e devono essere comunicate al metodo remoto chiamato METHOD_NAME
                                SoapObject RequestToWS = new SoapObject(NAMESPACE, METHOD_NAME);  
                                HttpTransport androidHttpTransport = new HttpTransport(URL);
                               
                                //IMPOSTO IL CONTENTUO DELLA BUSTA SOAP, ovvero ciò che questa comunicherà al WS
                                RequestToWS.addProperty("UserID", UserID.getText().toString());
                                RequestToWS.addProperty("Password", Password.getText().toString());
                                RequestToWS.addProperty("LangID", LangID.getText().toString());
                                RequestToWS.addProperty("SourceSystemCode", "");                               

                                //CREO IL RACCOGLITORE PER LA RISPOSTA WS
                            SoapSerializationEnvelope ResponseFromWS = new SoapSerializationEnvelope(SoapEnvelope.VER11);
                            ResponseFromWS.setOutputSoapObject(RequestToWS);//lego la risposta alla richiesta
                               
                            try
                            {   androidHttpTransport.debug = true;
                                androidHttpTransport.call(SOAP_ACTION, ResponseFromWS);//Invio SOAP e raccolto risposta
                                String[] risultati = (String[])  ResponseFromWS.getResponse();
                                Result.setText(risultati[0]);
                                TicketID.setText(risultati[1]);
                            }
                            catch (Exception aE){aE.printStackTrace ();}
                          }
                 });
         }
}





Eseguendo il Debug viene visualizzato l'errore: "Source not found" in corrispondenza del comando
androidHttpTransport.call(SOAP_ACTION, ResponseFromWS);



Dove sbaglio?? :(

Offline OmarLuigi

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Tab
  • Sistema operativo:
    Windows 7
Re:Problema Web Service
« Risposta #1 il: 05 Maggio 2011, 14:35:17 CEST »
0
VI POSTO IL CODICE CORRETTO CHE HO FATTO


Codice (Java): [Seleziona]
[]
private static final String SOAP_ACTION = "http://www.mustcoursemaker.net/WebServices/GetTicket";
private static final String METHOD_NAME = "GetTicket";
private static final String NAMESPACE = "http://www.mustcoursemaker.net/WebServices/";
private static final String URL = "[url=http://www.mustcoursemaker.net/direct/webservices/wslogin.asmx?wsdl";]
        wsLogin Web Service
[/url]
[]
1 Invia.setOnClickListener(new OnClickListener()
2 {     public void onClick(View v)
3       {       try
4               {       SoapObject richiestaSoap = new SoapObject(NAMESPACE, METHOD_NAME);  
5                       richiestaSoap.addProperty("UserID", UserID.getText().toString());
6                       richiestaSoap.addProperty("Password", Password.getText().toString());
7                       richiestaSoap.addProperty("LangID", LangID.getText().toString());
8                       richiestaSoap.addProperty("SourceSystemCode", "");
9                                      
10      SoapSerializationEnvelope bustaSoap= new SoapSerializationEnvelope (SoapEnvelope.VER11);
11                      bustaSoap.dotNet=true;                         
12                      bustaSoap.setOutputSoapObject(richiestaSoap);          
               
13                      HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
14                      androidHttpTransport.debug = true;
15                      androidHttpTransport.call(SOAP_ACTION, bustaSoap);
                               
16                      Object risposta = (Object)bustaSoap.getResponse();
17                      Result.setText(risposta.toString());
                }
                catch (Exception aE){aE.printStackTrace ();}
        }
});




IL PROBLEMA ADESSO è CHE IL SERVER MI RISPONDE CON UN ERRORE E CAMPI VUOTI, COME SE NON CAPISSE COSA GLI STO MANDANDO. PENSO SIA DOVUTO AL FATTO CHE IO COMUNICO CON RPC/encoded  E LUI CAPISCE Document/Literal ... ALMENO PENSO!!
SECONDO VOI IL PROBLEMA è QUESTO?
SE FOSSE QUESTO COME POSSO RISOLVERLO?

Offline OmarLuigi

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Tab
  • Sistema operativo:
    Windows 7
Re:Problema Web Service PERFAVORE AIUTATEMI! PROBLEMA FACILE X ESPERTI
« Risposta #2 il: 12 Maggio 2011, 15:26:44 CEST »
0
Premettendo che il codice postato in precedenza FUNZIONA per un altro web service trovare in rete che trasforma gradi celsius in fharenhait (ma continua a non funzionare per il mio), in questi giorno ho un po' investigato. Prima di tutto
Ho catturato i pacchetti http con uno sniffer, ricostruendo l'xml della richiesta che invio con il codice che ho postato in precedenza.
Ottengo:
Codice (XML): [Seleziona]
<v:Envelope
  xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:d="http://www.w3.org/2001/XMLSchema"
  xmlns:c="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:v="http://schemas.xmlsoap.org/soap/envelope/"
>
   <v:Header/>
   <v:Body>
      <GetTicket xmlns="http://www.mustcoursemaker.net/WebServices/" id="o0" c:root="1">
         <UserID i:type="d:string">x</UserID>
         <Password i:type="d:string">x</Password>
         <LangID i:type="d:string">x</LangID>
         <SourceSystemCode i:type="d:string">x</SourceSystemCode>
      </GetTicket>
   </v:Body>
</v:Envelope>


Al posto di quello che dovrei ottenere (preso da soupUI, che funziona!!)
Codice (XML): [Seleziona]
<soap:Envelope
        xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
        xmlns:web="http://www.mustcoursemaker.net/WebServices/"
>
        <soap:Header/>
        <soap:Body>
                <web:GetTicket>
                        <web:Request>
                                <web:UserID>x</web:UserID>
                                <web:Password>x</web:Password>
                                <web:LangID>x</web:LangID>
                                <web:SourceSystemCode>x</web:SourceSystemCode>
                        </web:Request>
                </web:GetTicket>
        </soap:Body>
</soap:Envelope>


Come si può notare la differenza sostanziale sta nel tag REQUEST, che nella richiesta funzionante è presente, mentre in quella non funzionante no. Andando nella descrizione del metodo nel web service:
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <GetTicket xmlns="http://www.mustcoursemaker.net/WebServices/"> <Request> <UserID>string</UserID> <Password>string</Password> <LangID>string</LangID> <SourceSystemCode>string</SourceSystemCode> </Request> </GetTicket> </soap:Body> </soap:Envelope>

Si può notare che effettivamente è presente il campo Request.


ORA, COME POSSO INSERIRE QUESTO CAMPO?
E' DAVVERO SOLO QUESTO IL PROBLEMA?


Ho provato ad inserirlo con questo codice:
Codice (Java): [Seleziona]
package omar.prova3;
import java.io.IOException;


import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.AndroidHttpTransport;
import org.xmlpull.v1.XmlPullParserException;


import omar.prova3.R;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;


@SuppressWarnings("deprecation")
public class prova3 extends Activity
{
        private static final String SOAP_ACTION = "http://www.mustcoursemaker.net/WebServices/GetTicket"; //preso dall'xml
        private static final String ELEMENT_NAME = "Request"; //nome del metodo
        private static final String METHOD_NAME = "GetTicket"; //nome del metodo
    private static final String NAMESPACE = "http://www.mustcoursemaker.net/WebServices/"; //preso dall'xml
    private static final String URL = "http://www.mustcoursemaker.net/direct/webservices/wslogin.asmx"; //url all'xml
    private TextView tv;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        tv=(TextView)findViewById(R.id.Result);
       
        SoapObject data = new SoapObject(NAMESPACE, ELEMENT_NAME);
        data.addProperty("UserID","x");
        data.addProperty("Password","x");
        data.addProperty("LangID","x");
        data.addProperty("SourceSystemCode","x");
               
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
        request.addProperty("Request", data);
               
        SoapSerializationEnvelope soapEnvelope= new SoapSerializationEnvelope(SoapEnvelope.VER11);
        soapEnvelope.bodyOut = request;
        soapEnvelope.dotNet=true;


        AndroidHttpTransport aht=new AndroidHttpTransport(URL);    
        try {   aht.debug=true;
                        aht.call(SOAP_ACTION, soapEnvelope);
                        Object resultString = (Object) soapEnvelope.getResponse();
                                tv.setText("Result:" + resultString);
                }
                catch (IOException e) {tv.setText(e.toString());} catch (XmlPullParserException e) {tv.setText(e.toString());}  
    }
}


Ma mi restituisce un nuovo errore (che bello), lunghissimo da scrivere, la cui parte più importante penso sia:
" Server was unable to read Request [...] There is an error in XML document (1,315) [...] The specified type was note recognized: name='Request', namespace='http:// ecc'"


Termino allegando la sniffata di quest'ultima prova che ho fatto:
Codice (XML): [Seleziona]
<v:Envelope
xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
xmlns:d="http://www.w3.org/2001/XMLSchema"
xmlns:c="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
        <v:Header />
        <v:Body>
                <GetTicket xmlns="http://www.mustcoursemaker.net/WebServices/" id="o0" c:root="1">
                        <Request i:type="n0:GetTicket" xmlns:n0="http://www.mustcoursemaker.net/WebServices/">
                                <UserID i:type="d:string">x</UserID>
                                <Password i:type="d:string">x</Password>
                                <LangID i:type="d:string">x</LangID>
                                <SourceSystemCode i:type="d:string"></SourceSystemCode>
                        </Request>
                </GetTicket>
        </v:Body>
</v:Envelope>








PER FAVORE AIUTATEMI SONO STATO PIù ESAUSTIVO POSSIBILE. E' UNA SETTIMANA CHE CI PROVO. IN RETE NON SI TROVA DOCUMENTAZIONE DEGNA DI QUESTO NOME PER STA DIAMINE DI KSOAP2!!!


GRAZIE
« Ultima modifica: 13 Maggio 2011, 14:58:49 CEST da OmarLuigi »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Problema Web Service
« Risposta #3 il: 12 Maggio 2011, 15:45:14 CEST »
0
Non ho mai usato webservice e a dirla tutta non so nemmeno come si usa ksoap, però posso provare a farti una osservazione: in google ho scritto android ksoap2 ed ho dato uno sguardo veloce ai primi 3 esempi pratici della prima pagina. Una differenza sostanziale è che rispetto al tuo usano una funzione specifica invece di assegnare l'oggetto requeste al bodyOut.

Può avere un senso provare?

Codice (Java): [Seleziona]
// soapEnvelope.bodyOut = request;
soapEnvelope.setOutputSoapObject(request);

EDIT: ti posto anche i link che ho guardato.
Using ksoap2 for android (SOAP Web Service) - android10
Using ksoap2 for android, and parsing output data | Hello Android
How to call a .NET Webservice from Android using KSOAP2? - Stack Overflow
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline OmarLuigi

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Tab
  • Sistema operativo:
    Windows 7
Re:Problema Web Service
« Risposta #4 il: 12 Maggio 2011, 16:04:37 CEST »
0
Grazie per avermi risposto.
Sì so che esiste anche quella funzione, già provata... Stesso risultato in tutti i test finora...!
Purtroppo penso quindi che non sia quello il problema...

Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
Re:Problema Web Service
« Risposta #5 il: 18 Maggio 2011, 11:08:03 CEST »
0
Per eliminare  id="o0" c:root="1" devi aggiungere nel codice la seguente riga:
 soapEnvelope.setAddAdornments(false);

Offline OmarLuigi

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Tab
  • Sistema operativo:
    Windows 7
Re:Problema Web Service
« Risposta #6 il: 20 Maggio 2011, 16:38:14 CEST »
+1

In pratica al codice corretto che avevo postato... Mancava un istruzione xD Un istruzione che, però, era fondamentale in quanto la struttura XML prevede campi incapsulati fra loro (in particolare, come detto nel post, è presente il campo <Request> all'interno di <GetTicket>)
L'istruzione a cui mi riferisco è "soapEnvelope.implicitType=true"...
Essa praticamente dichiara il fatto che all'interno della busta SOAP che si invierà sono appunto presenti tali campi incapsulati...
Ed in questo modo nel documento XML sarà presnete il campo <Request> privo di attributi! (e non come prima in cui c'era <Request namespace='' ecc>

Insomma si fa così!!! Ho provato la stessa metodologia con un latro WS che restituisce una risposta ben più complicata... E funziona!!!!