Web Service Client Android - 3

[No text]

Web Service Client Android - 2

Abbiamo a disposizione quindi un Web Service Northwind (come descritto nel precedente post) e quindi siamo in grado di partire con un nuovo progetto Eclipse per costruire un client che consumi i metodi del nostro WS. Creiamo quindi un nuovo progetto Android che chiameremo NorthwindClient...ovviamente. In figura la struttura del progetto completo nella versione finale:

Concentriamoci per ora sulla main activity il cui layout è costituito da alcuni bottoni e una textbox. Riproducete il layout come in fgura così da avere un bottone per ottenere la lista degli employees, un bottone per gli ordini del singolo employee il cui id viene inserito nella textbox ed infine un bottone per ottenere tutte le category di Northwind che visualizzeremo in un'altra activity dove visualizzeremo una Listview custom per renderizzare le immagini contenute in un campo base64 di category.

 

 

 

 

 

 

Ecco la main activity:

Per invocare il Web Service, faremo utilizzo delle tecniche di accesso alla rete asincrone. Come sappiamo in Android si utilizza una classe che estende AsyncTask<T1,T2,T3> generic. La nostra classe si chiama CallWebServiceTask e si occuperà di eseguire la chiamata al web service in maniera asincrona. Tale classe fornisce almeno due metodi (per la documentazione completa rimandiamo alla documentazione ufficiale di Android): uno che viene invocato per eseguire la chiamata in maniera asincrona su un thread differente rispetto allo UI-Thread (cioè quello che si occupa della renderizzazione della UI) e un altro per eseguire le operazioni di visualizzazione del risultato non appena il worker-thread ha ottenuto la risposta dal Web Service.

Lo scheletro della classe  (una inner class della classe Main) è il seguente:

 private class CallWebServiceTask extends AsyncTask<String, Void, OperationResult> {
   @Override
   protected OperationResult doInBackground(String... params) {
//..... } @Override protected void onPostExecute(OperationResult operationResult) { //...... } }

Come si vede il codice descrive la classe e i tipi coinvolti nell'operazione asincrona. Quando verrà invocato il metodo doInBackground questo in input si aspetta una o più stringhe(T1), ritornando in output un oggetto di tipo OperationResult (T3). Il secondo tipo T2 è di tipo void perchè non lo usiamo, ma sta a rappresentare il tipo utilizzato per restituire i valori parziali che illustrano il progresso dell'operazione in background.

OperationResult

Questo tipo di dato è un semplice oggetto con due proprietà:

 public class OperationResult {	
	private String actionName;
	private String result;

	public OperationResult() {
		super();
	}
	public OperationResult(String soapAction, String responseString) {
		// TODO Auto-generated constructor stub
		this.actionName = soapAction;
		this.result = responseString;
	}
	public String getActionName() {
		return actionName;
	}
	public void setActionName(String actionName) {
		this.actionName = actionName;
	}
	public String getResult() {
		return result;
	}
	public void setResult(String result) {
		this.result = result;
	}
}

La prima proprietà rappresenta il nome del metodo che noi abbiamo invocato, mentre la seconda contiene il SOAP di risposta proveniente dal Web Service. Questo sarà anche il tipo che si aspetta in input il metodo onPostExecute. Quest'ultimo rappresenta la callback che verrà invocata (ed eseguita sullo UI thread) appena il worker-thread avrà terminato l'invocazione del Web Service ed avrà ottenuto il SOAP di risposta.

Web Service Client Android - 1

Intro

Partiamo subito da una considerazione: quando le cose le facciamo noi...c'è più soddisfazione :-). Nel senso che in giro ci sono varie librerie per implementare un client Web Service che giri su Android, ma spesso tali librerie danno un pò di problemi e il codice che viene presentato non è mai del tutto chiaro o completo. In questa serie di post, vogliamo fornire una spiegazione esaustiva del meccanismo di implementazione di un service client Android corredando il tutto con codice sorgente scaricabile e funzionante.

Northwind Web Service

Veniamo prima di tutto alla parte server. Ho implementato un Web Service che si basa sul DB Northwind in esecuzione sul mio SQL Server (che prossimamente renderò pubblico) che espone una serie di metodi abbastanza significativi che vi espongo in questa figura:  

Vediamo per esempio "GetAllEmployees" che restituisce una collection di oggetti di tipo Employee (in realtà ho costruito delle entities più semplici per rendere più agevole l'elaborazione lato client. Infatti il nostro metodo restituirà una lista di LightEmployee. Altro metodo significativo è "GetOrderByIDEmployee" che restituisce una serie di LightOrder a seguito di un parametro di input di tipo intero. Infine "GetAllCategories" che restituisce una lista di LightCategory. Tale ultima entity contiene un campo string che rappresenta un base64 relativo ad un'immagine, così vediamo come si ricostruiscono le immagini su un Android ListView.

Infine ho sostituito il namespace all'interno del SOAP per rendere univoci i nomi dei metodi. Vediamo un esempio di transazione request-response a seguito dell'invocazione del metodo "GetAllEmployees":

 

La figura sopra rappresenta come noto la HttpRequest composta dalla request-line (POST /Services....), alcuni headers (Host, Content-Type,....SOAPAction) e il body contenente il SOAP XML. Da sottolineare tra gli headers "SOAPAction" il cui valore comprende il nome del metodo che vogliamo invocare (GetAllEmployees) preceduto dal namespace che abbiamo deciso di utilizzare. Due parole su tale namespace. In XML i namespace servono per rendere univoci i nomi dei tag. Si usano quindi dei nomi di dominio semplicemente perchè sono delle stringhe che, in quanto nomi appunto di dominio, sono di per sè univoche. E' chiaro quindi che il mitico "tempuri.org" (il namespace di default di MS Web Service) viene sostituito nel mio caso con "http://sandrovecchiarelli.com/Services/SVNorthwind".

Vediamo invece la Http-Response: 

Qui vediamo la struttura della entity LightEmployee contenente campi stringa, Data ed interi. Il valore di ritorno è una lista di tali entità che verrà ricostruita dalla parte di Android effettuando un parsing del SOAP XML.

Benvenuti!

 

Blog sweet blog

Questo blog vuole essere uno spazio in cui un "developer" vuole condividere tutte le proprie 'conquiste' avute sul campo nel risolvere alcune problematiche spinose riguardanti molte delle tecnologie più interessanti che ruotano intorno al mondo embedded e non solo. Vi saranno molte sezioni riguardanti tecnologia Microsoft, ma anche Android, iOS, Google, Java e tutto quello che per piacere...o per dovere :-) sono costretto ad affrontare. Qualunque sia la tecnologia affrontata, cercherò sempre di rendere il più facile possibile la comprensione degli argomenti e corredare il post con codice sorgente testato e funzionante.....stay tuned 

Calendar

<<  May 2013  >>
MoTuWeThFrSaSu
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

View posts in large calendar

Page List

RecentComments

None