I. Les Webservices▲
Les webservices sont des services de traitement de la donnée exposée sur internet, ils peuvent avoir plusieurs formes, provenir de plusieurs sites différents, faire des tâches diverses et être privés ou publiques.
Exemples :
- Données météorologique
- Calcul mathématique
- Stockage d'informations
- Etc...
Les webservices peuvent être codés en plusieurs langages (C#, Java, Php, Ruby, Python, C, etc...).
Nous allons nous intéresser plus précisément aux services retournant des données en JSON (JavaScript Object Notation).
Pourquoi le Json ? Et bien pour une question de facilité, bien entendue vous pouvez utiliser le XML aussi, mais le Json à la particularité d'être plus léger que XML, un gain de poids n'est pas anondin dans le domaine de la mobilité.
II. Les Pré-requis▲
Création d'un projet Android de type standard.
III. Les WebServices de test▲
http://testwebapi.lalimace.fr/api/Point
Ce service est développé en .Net sous forme de WebApi. Cette url retourne une liste de point géographique comportant les éléments suivants :
- Adress : Adresse du lieu
- City : Ville
- PostalCode : Code postal
- Latitude : Latitude
- Longitude : Longitude
IV. Structure de notre application▲
Notre application va être structurée de la manière suivante
- Vue (xml)
- ArrayAdapter
- Client pour le webservice
- Modèle de données
Nous allons aussi utiliser la librairie GSon, qui permet de sérialiser / désérialiser en JSon, inutile de réinventer la roue.
V. Appel au WebService▲
Nous allons créer une classe pour effectuer nos appels Exemple : WebService.java Nous retrouverons les éléments suivants dans notre classe
- La base de l'url pour le webservice
- L'objet Gson
- Un constructeur
- Une méthode private pour se connecter en Http au WebService et récupérer un inputStream
- Des méthodes pour chaque API disponible
public
class
WebService {
private
final
String URL =
"
http://testwebapi.lalimace.fr/api/Point
"
;
Gson gson;
public
WebService
() {
gson =
new
Gson
();
}
private
InputStream sendRequest
(URL url) throws
Exception {
try
{
//
Ouverture
de
la
connexion
HttpURLConnection urlConnection =
(HttpURLConnection) url.openConnection
();
//
Connexion
Ã
l'url
urlConnection.connect
();
//
Si
le
serveur
nous
répond
avec
un
code
OK
if
(urlConnection.getResponseCode
() =
=
HttpURLConnection.HTTP_OK) {
return
urlConnection.getInputStream
();
}
}
catch
(Exception e) {
throw
new
Exception
("
"
);
}
return
null
;
}
public
List<
Point>
getPoints
() {
try
{
//
Envoie
de
la
requète
InputStream inputStream =
sendRequest
(new
URL
(URL));
//
Vérification
de
l'inputStream
if
(inputStream !
=
null
) {
//
Lecture
de
l'inputStream
dans
un
reader
InputStreamReader reader =
new
InputStreamReader
(inputStream);
//
Return
la
liste
désérialisé
par
le
moteur
gson
return
gson.fromJson
(reader, new
TypeToken<
List<
Point>
>
(){
}
.getType
());
}
}
catch
(Exception e) {
Log.e
("
WebService
"
, "
Impossible
de
rapatrier
les
données
:(
"
);
}
return
null
;
}
}
sendRequest sera notre méthode générique pour appeler via un objet HttpUrlConnection le webservice, ici on se contente de faire un simple appel de type GET sur une URL. Le résultat retourné est toujours un InputStream que nous allons pouvoir traiter, nous pouvons avoir plusieurs types de données retournées par un webservice (XML,JSON,Image,Excel, etc...). Le type InputStream est facilement manipulable avec le Reader qui va bien. Notre cas se porte uniquement sur le JSON. Nous avons aussi besoin d'un modèle, le flux étant de type JSON il faut désérialisé celui-ci pour le transformer en un objet exploitable facilement. Nous allons donc créer un fichier Point.java dans lequel il contiendra les informations suivantes :
- Les propriétés
- Les accesseurs
Vous pouvez aussi rajouter vos propres propriétés, comme par exemple toString etc... Voici le code :
package
com.aceart.formationwebservice.model;
public
class
Point {
int
ID;
String Address;
String City;
String PostalCode;
float
Latitude;
float
Longitude;
public
int
getID
() {
return
ID;
}
public
void
setID
(int
iD) {
ID =
iD;
}
public
String getAddress
() {
return
Address;
}
public
void
setAddress
(String address) {
Address =
address;
}
public
String getCity
() {
return
City;
}
public
void
setCity
(String city) {
City =
city;
}
public
String getPostalCode
() {
return
PostalCode;
}
public
void
setPostalCode
(String postalCode) {
PostalCode =
postalCode;
}
public
float
getLatitude
() {
return
Latitude;
}
public
void
setLatitude
(float
latitude) {
Latitude =
latitude;
}
public
float
getLongitude
() {
return
Longitude;
}
public
void
setLongitude
(float
longitude) {
Longitude =
longitude;
}
}
Avec la librairie GSon tout se fait en une ligne pour transformer l'inputStream en Objet
return
gson.fromJson
(reader, new
TypeToken<
List<
Point>
>
(){
}
.getType
());
A partir de la vous obtenez donc une liste d'objets provenant d'un webservice retournant du JSon.
VI. Conclusion▲
Vous trouverez les sources de la démo en bas de l'article, contenant la partie affichage avec l'ArrayAdapter et la ListView, je ne vais pas m'attarder sur ces deux points car nous les avons déjà vus dans d'autres cours. Dans un prochain tutoriel nous aborderons l'utilisation du Spring Framework qui permet d'utiliser des WebServices de type REST facilement.
VII. Annexes▲
VIII. Remerciements▲
Je tiens à remercier tout particulièrement djibril qui a mis ce tutoriel au format Developpez.com.
Merci également à Kaera et à jacques_jean d'avoir pris le temps de le relire et de le corriger.