Android : Créer un client pour un web service REST/JSON

08 aout 2013 rdorigny 0 commentaires

Les web service sont partout, c'est une méthodologie plus ou moins normées très utilisée pour transmettre de l'information à une application. D'autant plus s'il s'agit d'une application mobile!

Nous utiliserons le web service REST/JSON du site openweathermap.org qui propose une API gratuite sous la forme d'un service web qui fournit la température de la position géographique (en fait d'autres cses! Et même des prévision météo!!) qui nous intéresse. Ce sera un parfait exemple pour réaliser notre application cliente.


1)L'API OpenWeatherMap

Déjà, première remarque, pas facile de trouver une API web service au format que je cherche, j'ai un peu galéré. Yahoo et Google propose leur paquet de service mais leur système d'authentification sophistiqué mon rapidement rebuté car l'objectif de cet article est quand même de faire simple!

Bref, j'ai trouvé cette API qui franchement m'a enthousiasmé par sa simplicité et ses fonctionnalités. Le tout en free, ce qui est quand même appréciable et sans abonnement ou authentification. Les données sont transmissent en JSON ou en XML, c'est au choix.

J'ai opté pour le format JSON qui devient incontournable tellement son usage est massif depuis que Google l'a démocratisé dans ses services web.

REST - JSON, KESAKO?

REST (REpresentational State Transfer) est un type d'architecture que l'on utilise de plus en plus pour réaliser un service web. Il est plus simple à mettre en oeuvre que SOAP mais n'est pas définit précisemment par un standard. REST est basé sur des requêtes transmises par des protocoles standards (http, ftp, ...), il renvoie un fichier souvent au format XML ou JSON.

JSON (JavaScript Object Notation) est un format de structuration des données. Les données sont considérées comme des objets avec des propriétés et sous-propriétés. Ce formalisme est assez proche de XML et est basé sur le langage javascript. Une page sur Wikipedia résume très bien JSON.

Fonctionnement de l'API
Super simple. Il suffit de suivre les indications du site et former sa requête dans son navigateur. Personnellement, j'ai réalisé cette requête http://api.openweathermap.org/data/2.5/weather?q=78470,fr&units=metric&lang=fr pour ma localité perso, c'est à dire l’excellente ville de St Rémy lés Chevreuse.

Ce qui retourne:
{"coord":{"lon":2.06223,"lat":48.7166},"sys":{"country":"France","sunrise":1375850083, "sunset":1375903209},"weather":[{"id":803,"main":"Clouds", "description":"nuages éparses","icon":"04n"}],"base":"gdps stations", "main":"temp":17.36,"pressure":1014,"temp_min":17,"temp_max":18,"humidity":91}, "wind":{"speed":3.26,"deg":43.0002},"rain":{"3h":0},"clouds":{"all":80},"dt":1375909840, "id":2977197,"name":"Saint-Rémy-lès-Chevreuse","cod":200}

Bon, c'est un peu en vrac mais si on regarde un peu attentivement on retrouve les objet avec leurs attributs. Celui qui nous intéresse est le main avec l'attribut temp qui représente la température actuelle.

2)Coder le client REST/JSON

Voilà comment cela se passe, tout d'abord on transmet notre requête par un HTTP/GET et on réceptionne la réponse au format JSON. Ensuite, il suffira d'exploiter les objets décrits et de récupérer les datas qui nous intéressent. Evidemment, le framework Android propose une class pour gérer les requêtes JSON, soit JSONObject. Cette class permet d'ccéder aux attributs des objets JSON.

Pour le code, n'oubliez pas deux conseils importants, il faut créer une tâche asynchrone pour réceptionner la requête car la réponse sera potentiellement lente et il ne faut pas oublier de modifier le fichier manisfest pour autoriser votre application mobile à accéder à Internet.

Le fichier manifest:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="fr.doritique.rzo6" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.INTERNET"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="fr.doritique.rzo6.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>

Le layout de notre application:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/montxt" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <Button android:id="@+id/MyBtn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Afficher la T° de St Rémy les chevreuse" > </Button> <TextView android:id="@+id/letexte" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="false" android:layout_below="@+id/MyBtn" android:layout_centerHorizontal="true" android:layout_centerInParent="false" android:layout_centerVertical="true" android:layout_marginTop="72dp" android:gravity="center_horizontal" android:textSize="25dp" /> </RelativeLayout>

package fr.doritique.rzo6; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONObject; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import android.app.Activity; public class MainActivity extends Activity { public Toast toast; public static final String TAG ="Mon_TAG"; public TextView letexte; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); letexte= (TextView) findViewById(R.id.letexte); Button btn = (Button) findViewById(R.id.MyBtn); btn.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Affiche(); } }); } public void Affiche(){ new RequestTask().execute("http://api.openweathermap.org/data/2.5/ weather?q=78470,fr&units=metric"); } private class RequestTask extends AsyncTask<String, Void, String> { private String response = ""; @Override protected String doInBackground(String... urls) { response=Recup_WS(); return response; } public String Recup_WS(){ response="Ca ne marche pas..."; HttpClient httpclient= new DefaultHttpClient(); try { HttpGet httpGet= new HttpGet("http://api.openweathermap.org/data/2.5/weather?q=78470,fr&units=metric"); HttpResponse httpresponse=httpclient.execute(httpGet); HttpEntity httpentity=httpresponse.getEntity(); if (httpentity!=null){ InputStream inputstream=httpentity.getContent(); BufferedReader bufferedreader=new BufferedReader( new InputStreamReader(inputstream)); StringBuilder strinbulder=new StringBuilder(); String ligne=bufferedreader.readLine(); while (ligne!=null){ strinbulder.append(ligne+"n"); ligne=bufferedreader.readLine(); } bufferedreader.close(); JSONObject jso=new JSONObject(strinbulder.toString()); JSONObject jsomain=jso.getJSONObject("main"); response=jsomain.getString("temp"); } } catch (Exception e) { Log.e(TAG, e.getMessage()); } return response; } @Override protected void onPostExecute(String result) { letexte.setText(result); } } }

Et donc à chaque fois que l'on appuie sur le bouton, notre application cliente appelle l'API, réceptionne les données pour y puiser la température et rafraîchit l'affichage


Conclusion

Voilà, vous savez créer une application cliente qui appelle un web service au format REST/JSON. Ya plus qu'à...






Pseudonyme (obligatoire) :
Adresse mail (obligatoire) :
Site web :




© 2017 www.doritique.fr par Robert DORIGNY