PHP & Android : Créer un web service REST/JSON

19 aout 2013 rdorigny 0 commentaires

Cet article décrit comment créer un web service en REST JSON en PHP. Dans les faits, C'est super-simple, le plus difficile est de bien comprendre les concepts.

Nous reprendrons le client Android de l'article précédent pour tester notre serveur de service! Ce sera un bon exemple d'application client/serveur.


1) Quelques notions

1.1) Les différentes architectures

La première chose avant de commencer est de bien comprendre les notions qui entoure un service web. Il existe trois type de service web : RPC, SOAP et REST.

RPC et SOAP sont des architectures de services webs complexes, souvent trouvées dans le monde professionnel sur de gros systèmes d'informations. Généralement, ils sont accompagnés du langage de description WSDL qui permet de proposer une l'annuaire des services du serveur.

Très compliqué à mettre en oeuvre, ces architecture ont rebutés longtemps les développeurs en herbe, c'est pourquoi les fournisseurs de web services ont créé une architecture simplifiée (merci Google...) pour favoriser l’accès aux développeurs à leurs bouquets d'API, il s'agit de l'architecture REST. On parle aussi d'application RESTFULL, il s'agit de la même chose, c'est juste un adjectif.

1.2) L'architecture REST

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

Un service REST permet de traiter des ressources distantes, pour cela il définit 4 fonctions dites de bases:
  • GET: pour lire la ressource,
  • PUT: pour modifier la ressource,
  • DELETE: pour supprimer la ressource,
  • POST: pour écrire la ressource.

  • On accède aux données via le protocole HTTP par des urls du type: http://www.monexample.com/webservice/data/item1
    Il également possible de préciser dans l'url, l'action que l'on souhaite réaliser sur la ressource, comme par exemple: http://www.monexample.com/webservice/api.php?action=get&var=item1 Concrètement, il s'agira d'écrire un script en PHP qui définit ces traitements.

    1.3) Les formats d'échanges

    Les formats d'échange sont le XML ou le JSON. On parle aussi de sérialisation des données. J'ai retenu le format JSON qui est très employé dans les API.

    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.

    2) Ecrire une API REST/JSON en PHP

    Nous allons faire simple dans notre exemple, je vais aller à l'essentiel pour faciliter la compréhension du lecteur. Mais il faut être conscient que le code ci-dessous est ultra-basique, et qu'il mérite une amélioration d'ensemble.

    L’objectif de notre client/serveur web est d'afficher la température de notre localité. Pour cela, nous n'allons écrire que la fonction GET dans notre API, il ne vous sera pas difficile de coder les trois autres fonctions! :-) Pour les données, nous les simulerons par un tableau avec la variable tab. Il vous suffira d'initialiser ce tableau avec vos données pour réutiliser ce code.

    Donc voici, le script simplifié de notre API:
    <?php if ((isset($_GET["action"]))&&(isset($_GET["var"]))) { switch ($_GET["action"]) { case ("get") : api_get($_GET["var"]); break; default: print("L'action appelée n'existe pas."); } } else print("Erreur lors de l'utilisation de l'API"); function api_get($var) { switch ($var) { case ("temp") : //Récupération des données $tab = array(); $tab["context"] = array("id" => "441618","owner" => "DORIGNY Robert", "local" => "fr,Saint Remy les chevreuse","First boot"=>"15/08/2013"); $tab["pht"] = array("pres" => "1003","hum" => "54","temp" => "22.06"); print(json_encode($tab)); break; default: print("La variable appelée n'existe pas."); } } ?>

    Et donc notre API retourne un fichier json, pour le tester il suffit de taper dans un navigateur une url de la forme http://votreserveurweb/api.php?action=get&var=temp . Ce qui retournera :
    {"context":{"id":"441618","owner":"DORIGNY Robert","local":"fr,Saint Remy les chevreuse", "First boot":"15/08/2013"},"pht":{"pres":"1003","hum":"54","temp":"22.06"}}

    3) Un client Android pour notre API

    Nous allons reprendre le client Android de l'article précédent et l'adapter à notre API.
    Pour le layout :
    <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>


    Pour le code de l'application mobile :
    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://votreserveurweb/api.php?action=get&var=temp"); } private class RequestTask extends AsyncTask<String, Void, String> { private String response = ""; @Override protected String doInBackground(String... urls) { response=Recup_WS_domo(); return response; } public String Recup_WS_domo(){ response="Ca ne marche pas..."; HttpClient httpclient= new DefaultHttpClient(); try { HttpGet httpGet= new HttpGet("http://votreserveurweb/api.php?action=get&var=temp"); 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("pht"); response=jsomain.getString("temp"); } } catch (Exception e) { Log.e(TAG, e.getMessage()); } return response; } @Override protected void onPostExecute(String result) { letexte.setText(result); } } }


    Sans oublier de modifier votre 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>

    En cliquant sur le bouton, l'application réalisera une requête sur notre API, et réceptionnera le fichier JSON. Ensuite, il n'y a plus qu'à récupérer le champ température et à l'afficher.

    Conclusion

    Nous l'avons vu, la création d'un web service REST/JSON n'est pas difficile à réaliser, il suffit juste de se donner un peu de peine... Beaucoup rechignent à utiliser ce type de technologie, et pourtant les web services ont été pensés pour nous simplifier la vie!



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




    © 2024 www.doritique.fr par Robert DORIGNY