Aller au contenu


Conception d'un WebService selon l'architecture REST


29 réponses à ce sujet
  • Vous ne pouvez pas répondre à ce sujet

#1
goldbergg

  • messages 176
  • Inscrit(e) : 06 octobre 2011

  • Humeur du actuel : Aucun choisi

Réputation : 51 (Se fait un nom)

EDIT : MAJ le 11/10/2016, nouveau lien pour DL les source : http://gold-s.net/La...RVICE/ressource

Dernièrementje vous parlé des WebService (WS) et de REST (http://forum.animese...les-webservice/), voici aujourd'hui un tutoriel surla façon de concevoir des WebService de façon assez basic.

note : Cette article s'adresse au développeur ayant une bonne approche des technologie du Web (PHP, Ajax, etc...).

Sommaire:



  • Le besoin
  • La définition des spécifications
  • Le code

1. Le Besoin

Avant de commencer à coder il faut savoir ce que l'on doit coder, en effet les WS devront répondre a un certain besoin dont l'utilisateur a accès et afin de garantir la pérennité du WS il est or de question que se dernier subisse des modifications après sa mise en ligne (ormie pour l'optimisation du code ou l'ajout de ressource).

Afin de mieux démontrer la marche a suivre je vais prendre un exemple relativement simple: "La gestion d'utilisateur".

Je vais donc me mettre en condition :

"Je souhaite mettre à la disposition un WS permettant de gérer une liste d'utilisateur. Chaque utilisateur aura: un nom, un prénom, un pseudo et un mot de passe. Le WS permettra d'avoir la liste desutilisateur, d'afficher un utilisateur, de le modifier, de le supprimer et enfin d'en ajouter un."

Voilà j'ai mon besoin, les mots souligner sont ce qu'il y a retenir, on peut donc déjà prévoirqu'on aura une BDD pour stocker les utilisateurs et que l'on pourra faire différente action dessus.

Dans cette exemple la liste d'utilisateur sera commune à tous les utilisateur du WS, on pourrait facilement penser un système d'authentification (avec une inscription aupréalable sur le site fournissant le WS) permettant a chaque utilisateur du WS d'avoir sa propre liste d'utilisateur.

2. La définition des spécifications

Voilà,maintenant que j'ai mon besoin je peux vraiment commencer la conception du WS avec la définition des spécifications.

Revoyons les actions que permettra le WS:



  • Fournir la liste des utilisateurs (ressource 1).
  • Afficher un utilisateur (ressource 2).
  • Modifier un utilisateur (ressource 2).
  • Supprimer un utilisateur (ressource 2).
  • Ajouter un utilisateur (ressource 2).

On peut donc constater que l'on aura 5 possibilité que l'on peut séparer en deux ressource,la première concernant la liste des utilisateur et la seconde conserant les utilisateurs a l'unité.

Deux ressource donc deux URI, pour l'exemple le WS sera héberger sur un site fictif que l'on nommera http://MonSitedeWS.fr/et les WS seront dans le répertoire /WEBSERVICE/Utilisateur,les WS seront donc accessible depuis cette adresse:
http://MonSitedeWS.fr/WEBSERVICE/Utilisateur.

Ma premièreressource sera accessible via l'URI: http://MonSitedeWS.f...LstUtilisateurs/et la seconde: http://MonSitedeWS.f...ur/Utilisateur/.

Voyons maintenant plus en détail les spécifications:

Ma premièreressource permet d'obtenir la liste des utilisateurs:



  • Elle ne prendra aucun paramètre.
  • Elle sera appelée via la méthode par défaut (GET).
  • Elle retournera un tableaux de tableaux en JSON sous cette forme [{"Utilisateur_ID":"1","Utilisateur_Nom":"Nom Utilisateur 1","Utilisateur_Prenom":" Prenom Utilisateur 1","Utilisateur_Pseudo":"Pseudo Utilisateur 1","Utilisateur_Pass":"Pass Utilisateur 1"},{"Utilisateur_ID":"2","Utilisateur_Nom":"Nom Utilisateur 2","Utilisateur_Prenom":" Prenom Utilisateur 2","Utilisateur_Pseudo":"Pseudo Utilisateur 2","Utilisateur_Pass":"Pass Utilisateur 2"}, etc...] .
  • Elle sera appelée via l'URI: http://MonSitedeWS.f...LstUtilisateurs/.

Ma deuxième ressource permet plusieurs actions:

- Affiche run utilisateur.



  • Elle prendra en paramètre l'ID de l'utilisateur a affiché sous forme application/x-www-form-urlencoded ex: "ID=1".
  • Elle sera appelée via la méthode par défaut (GET).
  • Elle retournera un tableau en JSON sous cette forme {"Utilisateur_ID":"1","Utilisateur_Nom":"Nom Utilisateur","Utilisateur_Prenom":" Prenom Utilisateur","Utilisateur_Pseudo":"Pseudo Utilisateur","Utilisateur_Pass":"Pass Utilisateur"}.
  • Elle sera appelé via l'URI: http://MonSitedeWS.f...ur/Utilisateur/http://MonSitedeWS.f...eur/Utilisateur/ID/ (ID étant l'ID de l'utilisateur que l'on souhaite obtenir).

- Modifier un utilisateur.



  • Elle prendra en paramètre un tableau en JSON sous cette forme {"Utilisateur_ID":"1","Utilisateur_Nom":"Nom Utilisateur","Utilisateur_Prenom":" Prenom Utilisateur","Utilisateur_Pseudo":"Pseudo Utilisateur","Utilisateur_Pass":"Pass Utilisateur"}.
  • Elle sera appelé via la méthode PUT.
  • Elle retournera un booléen.
  • Elle sera appelée via l'URI: http://MonSitedeWS.f...ur/Utilisateur/.

- Supprimerun utilisateurs.



  • Elle prendra en paramètre l'ID de l'utilisateur a affiché sous forme application/x-www-form-urlencoded ex: "ID=1".
  • Elle sera appelé via la méthode DELETE.
  • Elle retournera un booléen.
  • Elle sera appelé via l'URI: http://MonSitedeWS.f...ur/Utilisateur/.

- Ajouter unutilisateur



  • Elle prendra en paramètre un tableaux en JSON sous cette forme {"Utilisateur_Nom":"Nom Utilisateur","Utilisateur_Prenom":" Prenom Utilisateur","Utilisateur_Pseudo":"Pseudo Utilisateur","Utilisateur_Pass":"Pass Utilisateur"}.
  • Elle sera appelée via la méthode POST.
  • Elle retournera un booléen.
  • Elle sera appelée via l'URI: http://MonSitedeWS.f...ur/Utilisateur/.

Voilà j'ai mes spécification, elles me permettront de coder le WS et à l'utilisateurd'utiliser le WS correctement.

3. Le code

Pour la suite je vous invite à télécharger le fichier de ressource suivant: http://jheberg.net/captcha/ressource/

 

Et voici un package avec Uwamp préconfigurer et pres a l'emploie

 

Il contient:



  • Le WS.
  • Un exemple d'utilisation en Ajax.
  • Un exemple d'utilisation en C# (pour les utilisateurs de Linux et Max, je n'est pas testé la compatibilité avec mono runtime).

Pour les exemples en Ajax et en C# il faudra que vous modifier les URI avec celle que vous obtiendrez en installant le WS sur votre PC via un serveur AMP ou sur un serveur en ligne. Pour l'exemple Ajax il suffit de modifier les deux variable en haut du fichier script.js, pour l'exemple C# il faut modifier le fichierParam.xml.

Le répertoireWEBSERVICE contient deux répertoires et un fichier nommé .htaccess, il va permettre de faire de l'URL rewriting, voici sont contenu :



  • RewriteEngine On
  • RewriteBase /WEBSERVICE
  • RewriteRule ^Utilisateur/Utilisateur/{:content:}nbsp; Utilisateur/Utilisateur.php [L]
  • RewriteRule ^Utilisateur/Utilisateur/([0-9]+)/{:content:}nbsp; Utilisateur/Utilisateur.php?ID=$1 [L]
  • RewriteRule ^Utilisateur/LstUtilisateurs/{:content:}nbsp; Utilisateur/LstUtilisateurs.php [L]

La première ligne indique que l'on active la réécriture d'URL (il faut que le serveur le gère,pour apache il y a un module a activé sil il n'est pas activé par défaut), la seconde ligne le répertoire a partir duquel on va faire les réécritures. Lestrois dernières lignes permettent de faire la réécriture. On peut constater quela réécriture n'est pas importante (ajout de l'extension .php) mais si on veut garantir l'indépendance du langage utilisé il faut impérativement faire ce genre de réécriture.

Si l'on décidé de changé le langage du WS on aurait juste à modifier ce fichier pour garantirla pérennité des URI

ex:
RewriteRule ^Utilisateur/LstUtilisateurs/$ Utilisateur/LstUtilisateurs.php [L]
deviendrait
RewriteRule ^Utilisateur/LstUtilisateurs/$Utilisateur/LstUtilisateurs.asp [L]
si l'on passerai de PHP a ASP, l'URI resterai la même: Utilisateur/LstUtilisateurs/.

Pour le code PHP je vous laisse la joie de le lire, il n'y a pas de commentaire mais il reste relativement simple, voici quand même quelque explication:

ws_utilisateurs.sql permet de créé la table dans la base de donnée, il vous faudra ensuite modifierle fichier param_bd.php avec votre configuration.

Le fichier rest.php permet de créé les variable global $_POST, $_PUT et $_DELETE a partir de donné en JSON ou en XML, pour se faire il utilise la fonction file_get_contents("") qui permet de récupéré en brut les paramètre envoyé au serveur.

Les fichiers LstUtilisateurs.php et Utilisateur.php utilise la variable $_SERVER['REQUEST_METHOD'] pour connaitre la méthode utilisé puis utilise une condition "Selon" pour effectuer sa tâche.

Pour le code en Ajax j'ai utilsé Jquery pour simplifier le code.

Le Code C# utilise un DataGridView couplé a une source de donnée créé a partir de la classe collection Lst_Utilisateurs (qui contient un list d'objet Utilisateur créé a partir des utilisateur envoyé par le WS).


Pour ceux que sa intérésse de voire se que donne un WS plus concéquent google propose via ces APIs des WS de type REST:
http://code.google.c...ng_started.html
voici les spécification des WS pour google calendar:
http://code.google.c.../reference.html
(avec la possibilité de tester en ligne)


Si vous avez des questions ou des remarque a faire n'ésité pas.


Modifié par goldbergg, 11 octobre 2016 - 13:03.

  • 4

#2
Mouquette

  • messages 23
  • Inscrit(e) : 21 novembre 2011

  • Humeur du actuel : Aucun choisi

Réputation : 1 (Neutre)
C'est donc bien ce que je pensais, du côté serveur sa reste du PHP (ou de l'ASP, selon)
C'était surtout cette partie la qui était sombre pour moi
Donc rien de bien compliqué en fait ;)
  • 0

#3
goldbergg

  • messages 176
  • Inscrit(e) : 06 octobre 2011

  • Humeur du actuel : Aucun choisi

Réputation : 51 (Se fait un nom)
Oui sa n'a rien de compliqué, aprés tous dépendera biensur de se que l'on codera comme type de WS

Coté serveur on peux avoire n'importe quelle language suporté par un serveur HTTP (C, C#, C++, Java, Perl, Python, VB, etc...)

Modifié par goldbergg, 03 décembre 2011 - 22:39.

  • 0

#4
aladin2110

  • messages 9
  • Inscrit(e) : 12 mai 2012

  • Humeur du actuel : Aucun choisi

Réputation : 0 (Neutre)
bonjour,
Merci bien pour ce tutoriel
juste je veux savoir comment faire pour consommer ce web service par client android
je suis entrain de faire un projet client(android) serveur : mon client à le droit de consulter seulement.
pour le web service je choisie de le faire en REST php mais je sais pas comment
pouvez vous m'aider SVP
  • 0

#5
goldbergg

  • messages 176
  • Inscrit(e) : 06 octobre 2011

  • Humeur du actuel : Aucun choisi

Réputation : 51 (Se fait un nom)
Salut,

Si tu veux faire appel a un webservice via une application android il te faudra faire appel a plusieur class:
-DefaultHttpClient pour pouvoire comuniqué avec le serveur
-httpput, httpost, httpget et httpdelete en fonction de la méthod a utilisé
-HttpResponse pour recupéré la reponsse
et en enffin JSONObject et JSONArray si tu doit ressevoire des reponsse en json (il existe aussi des class pour le XML).

Voici un petit exemple:
public void AppelGet() throws ClientProtocolException, IOException, JSONException{	

	DefaultHttpClient client = new DefaultHttpClient();

	String getURL = "URI de ton WebSevice";

	HttpGet get = new HttpGet(getURL);
	HttpResponse responseGet = client.execute(get);
	HttpEntity resEntityGet = responseGet.getEntity();

	if (resEntityGet != null) { //On a obtenue une reponsse
		String reponse = EntityUtils.toString(resEntityGet);
        	reponse = "{\"tab\":" + reponse + "}"; 
        	JSONObject jObject = new JSONObject(reponse);
        	JSONArray itemArray = jObject.getJSONArray("tab");
	}
}


Autre exemple avec la methode post et passage de paramétre pour tester la connexion a un site, le WS retourn un booléen:
public Boolean TestConnect(String login2, String pass2){
	String PostURL = "URI de Mon WebService";
	HttpPost httppost = new HttpPost(PostURL);
	DefaultHttpClient httpclient = new DefaultHttpClient();
        
	try {
        	List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
 			nameValuePairs.add(new BasicNameValuePair("Pseudo", login2)); //Paramétre 1
 			nameValuePairs.add(new BasicNameValuePair("Password", pass2)); //Paramétre 1
 			httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            HttpResponse response=httpclient.execute(httppost);
            BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
            String reponse = reader.readLine();
            int bool = Integer.parseInt(reponse); 
            
    	boolean b;
            
            b = (bool == 0 ? false : true) ;
        	if (<img src='http://forum.animeserv.net/public/style_emoticons/<#EMO_DIR#>/cool.gif' class='bbc_emoticon' alt='B)' />{
        		return true;
        	} else {
        		return false;
        	}
    	} catch (ClientProtocolException e) {
			Toast.makeText(GAL_MOBILEActivity.this, "Erreur: ClientProtocolException - > "+e, Toast.LENGTH_LONG).show();
			e.printStackTrace();
			return false;
		} catch (IOException e) {
			Toast.makeText(GAL_MOBILEActivity.this, "Erreur: IOException - > "+e, Toast.LENGTH_LONG).show();
			e.printStackTrace();
			return false;
		}
}

Si les exemple ne sont pas assé claire ou si je n'est pas repondu a ta question n'esite pas
  • 0

#6
aladin2110

  • messages 9
  • Inscrit(e) : 12 mai 2012

  • Humeur du actuel : Aucun choisi

Réputation : 0 (Neutre)
Bonsoir,
désolé pour le retard et merci pour votre réponse
en effet, mon projet consiste à la consultation d'une base de donné externe du grand surface via android.j'ai besoin de (GET) seulement et peut être (POST)
j'ai testé votre exemple en localhost mais j'ai aucun résultat pour celle là http://localhost/Utilisateur.php?ID=1
pour les liste des utilisateurs ça marche mais si je veux consulter un unique utilisateur ça marche pas
autrement SVP pouvez vous m'informer si je doit utiliser votre exemple ou bien Zend Framework pour créer mon web service et avez vous des exemples explicatif pour m'aider c'est très urgent et comment faire pour sécuriser mon web service
merci infiniment
  • 0

#7
goldbergg

  • messages 176
  • Inscrit(e) : 06 octobre 2011

  • Humeur du actuel : Aucun choisi

Réputation : 51 (Se fait un nom)
Le lien que tu me fournie n'est pas significatif vue qu'il pointe vere ton PC et est accéssible que depuis ton PC.

A tu testé le WS qui ne fonctione pas sur un navigateur pour être sur qu'il fonctione bien?

A tu essayé d'envoyé les paramétre autrement que par l'URI, par exemple via la classe nameValuePairs?

DefaultHttpClient client = new DefaultHttpClient();
String getURL = "http://localhost/Utilisateur.php";
HttpGet get = new HttpGet(getURL);
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
	nameValuePairs.add(new BasicNameValuePair("ID", 1));
get.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse responseGet = client.execute(get);
HttpEntity resEntityGet = responseGet.getEntity();
Au pire fournie moi ton code histoire de voire si il n'y a pas un probléme dans sa conception.

Pour se qui est du choi du framework, peut importe, zend founie un moyen de créé plusieur type de WS (SOAP, XML-RPC et REST) chacun a un moded'utilisation different, persso je te conseille REST car il est aussi performent et bien plus simple que les autre.
Persso je préfére codé tout a la main, surtous qu'il n'y a rien de bien compliqué.

Tu as peut être du remarqué que je fournie un fichier de ressource dans cette page : Ressource.zip tu peux t'en inspiré, il est assé simple mais plutop complé pour ilustré le bon fonctionement ainssi qu'une bonne façon de réalisé simplement un WS.

Si certain detail t'échape tu peux aussi consulter cette page: http://forum.animese...les-webservice/
  • 0

#8
aladin2110

  • messages 9
  • Inscrit(e) : 12 mai 2012

  • Humeur du actuel : Aucun choisi

Réputation : 0 (Neutre)
Bonjour
merci bien pour votre réponse
juste je veux vous dire que je test mon web service en local avant de faire l'appel via le client android
concernant http://localhost/WEB...sateur.php?ID=1 ça marche en localhost
maintenant je suis entrain de créer mon propre web service concernant mon application
juste je veux savoir est ce que le fichier .htaccess je le mettre dans le même dossier de mon webservice de plus puisque je besoin que de GET le fichier REST.php est inutile dans mon cas n'est ce pas?
merci infiniment pour ton aide et j'espère que je vous dérange pas par mes questions.
  • 0

#9
goldbergg

  • messages 176
  • Inscrit(e) : 06 octobre 2011

  • Humeur du actuel : Aucun choisi

Réputation : 51 (Se fait un nom)
Le fichier REST.php sert a créé les variable global $_PUT et $_DELETE donc non il n'est pas nessécaire.

Pour le .htaccess généralement on le mes a la racine du serveur, mais il devrais fonctioné si on le mes dans le repertoire qui contient le site, il suffit de bien configuré les directive a l'interieur.

Modifié par goldbergg, 18 mai 2012 - 10:20.

  • 0

#10
aladin2110

  • messages 9
  • Inscrit(e) : 12 mai 2012

  • Humeur du actuel : Aucun choisi

Réputation : 0 (Neutre)
Bonjour,
merci bien pour votre aide :rolleyes:
  • 0

#11
aladin2110

  • messages 9
  • Inscrit(e) : 12 mai 2012

  • Humeur du actuel : Aucun choisi

Réputation : 0 (Neutre)
Bonsoir,
désolé pour le dérangement je veux juste vous montrer mon code client
le problème que j'ai rien récupérer avec le client android
j'ai pris votre exemple pour la partie webservice

ci-dessous mon code client


public class GestionSurfaceActivity extends ListActivity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// setContentView(R.layout.main);
		String result = null;
		InputStream is = null;
		JSONObject json_data = null;
		ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
		ArrayList<String> donnees = new ArrayList<String>();

		try {
			// commandes httpClient
			HttpClient httpclient = new DefaultHttpClient();
			HttpPost httppost = new HttpPost("http://10.0.2.2/WEBSERVICE/LstProduit.php/");
			httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
			HttpResponse response = httpclient.execute(httppost);
			HttpEntity entity = response.getEntity();
			is = entity.getContent();
		} catch (Exception e) {
			Log.i("taghttppost", "" + e.toString());
			Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG)
					.show();
		}

		// conversion de la réponse en chaine de caractère
		try {
			BufferedReader reader = new BufferedReader(new InputStreamReader(
					is, "UTF-8"));

			StringBuilder sb = new StringBuilder();

			String line = null;

			while ((line = reader.readLine()) != null) {
				sb.append(line + "\n");
			}

			is.close();

			result = sb.toString();
		} catch (Exception e) {
			Log.i("tagconvertstr", "" + e.toString());
		}
		// recuperation des donnees json
		try {
			JSONArray jArray = new JSONArray(result);

			for (int i = 0; i < jArray.length(); i++) {

				json_data = jArray.getJSONObject(i);
				donnees.add("nom : "+ json_data.getString("nom"));
				// r.add(json_data.getString("categorie"));
				result += "\n\t" + jArray.getJSONObject(i); 
			}
	
	 setListAdapter(new ArrayAdapter<String>(this,
					android.R.layout.simple_expandable_list_item_1, donnees));
		} catch (JSONException e) {
			Log.i("tagjsonexp", "" + e.toString());
		} catch (ParseException e) {
			Log.i("tagjsonpars", "" + e.toString());
		}

	}



}

  • 0

#12
goldbergg

  • messages 176
  • Inscrit(e) : 06 octobre 2011

  • Humeur du actuel : Aucun choisi

Réputation : 51 (Se fait un nom)
Bon déjà je ne sais pas comment tu a construit ton WS, mais tu utilise la mauvaise méthode HTTP.

Tu fais un appel pour avoire la liste des produits et tu utilise la méthode POST.

Pour rappel:
GET - > appel (requete correspondante en SQL : SELECT)
POST -> soumission (requete correspondante en SQL : INSERT)
PUT -> Ajout/Modification (requete correspondante en SQL : UPDATE)
DELETE -> Supression (requete correspondante en SQL : DELETE)

Donc la méthode adequate serait plus HttpGet.

Autre chose, si tu n'envoie aucun paramétre, inutile d'utilisé la classe nameValuePairs
Voici pour moi a quoi devrait ressemblé le code (sans les instruction Try/Catch):
//J'instancie mon client
DefaultHttpClient client = new DefaultHttpClient();	
//J'appel mon WS
HttpGet get = new HttpGet("http://10.0.2.2/WEBSERVICE/LstProduit.php"); 
//Je recupére la réponsse
HttpResponse responseGet = client.execute(get);
HttpEntity resEntityGet = responseGet.getEntity();
//Si j'ai une reponsse...
if (resEntityGet != null) {
	//... je la recupére dans une chaine
	String reponse = EntityUtils.toString(resEntityGet);
	//Je place ma chaine(qui est un tableau JSON généré en PHP) dans un tableau associatif en JSON dont la clée de la premiére et unique case est "tab"
    reponse = "{\"tab\":" + reponse + "}";
	//Je convertie ma chaine en JSONObject
    JSONObject jObject = new JSONObject(reponse);
	//A partir de la clée "tab" de mon tableau assoc créé précédement, je recupére le contenu(le JSON généré par PHP donc) et le place dans un JSONArray
    JSONArray itemArray = jObject.getJSONArray("tab");
	//Je recupre le nombre d'élément...
    int nbItemArray = itemArray.length();
	//... pour pouvoire traiter mon tableau dans une boucle
   	for (int i=0;i != nbItemArray; i++)
  	{
		//traitement de mon tableau JSON
  	}        				
}


Autre chose, a tu testé en placant des Toast ou en utilisant le debogeur que tu ressois bien une reponsse avant d'essayé de la traité?
  • 0

#13
aladin2110

  • messages 9
  • Inscrit(e) : 12 mai 2012

  • Humeur du actuel : Aucun choisi

Réputation : 0 (Neutre)
Bonsoir,
merci pour votre aide
pour le web service c'est comme le votre
j'essayerais votre code pour la partie client
merci infiniement

Bonsoir
vraiment je trouve pas des mots pour vous remercie
j'ai testé votre code et ça va marcher
désolé pour le dérangement
merci

Modifié par Nesse1040, 16 août 2012 - 06:00.

  • 0

#14
Tornado

      God’s in his heaven, all’s right with the world

  • messages 1 067
  • Inscrit(e) : 19 janvier 2012

  • Humeur du actuel : Vegged Out

Réputation : 75 (Se fait un nom)
Je dois te félicité...d'avoir rédiger ton tutoriel sans aucune aide. C'est pas que j'ai pas confiance.
Mais c'est quelque chose de rare. Donc +1 remerciement.

Je note sur mon carnet de le regarder en profondeur une fois mes partiels passé. C'est dommage que c'était pas pendant mon devoir de Web...mais bon on peut pas demander la lune non plus.

Modifié par Anonymous, 19 mai 2012 - 19:23.

  • 0

131222073057808347.png

Spoiler

#15
aladin2110

  • messages 9
  • Inscrit(e) : 12 mai 2012

  • Humeur du actuel : Aucun choisi

Réputation : 0 (Neutre)
Bonsoir,
SVP pouvez vous m'aider et me montrer comment créer un web service php pour les images et les récupérer par android
en faite :
j'ai une liste de produit chaque produit à un id, nom, description,prix et image
je veux créer son web service le parser sous JSON et le récupérer par android, je veux lorsque je clic sur un produit qq dans ma liste view il m'affiche son image correspondant.J'ai réussi de récupérer les autres info sauf l'image je sais pas comment
Merci d'avance
  • 0

#16
goldbergg

  • messages 176
  • Inscrit(e) : 06 octobre 2011

  • Humeur du actuel : Aucun choisi

Réputation : 51 (Se fait un nom)
Bonjour,

Pour afficher une image dans un listview il faut dabort bien évidement recupérer le chemin de l'image sur forme d'une URL (ex : http://monDomaine.fr...in/monImage.jpg)

Donc dans ton PHP, quand tu créé ton tableau avec les diferente information sur les produit il faut que tu rajoute systématiquement un champ avec l'URL de l'image corespondante.

Enssuite il y a plusieur solution, persso voici celle que j'utilise:

Dans un premier temp tu créé ta view qui contiendra ton ListView:

<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:cacheColorHint="#00000000">
</ListView>


(la propriété cacheColorHint avec les valeur a 0 sert a evité des bug d'affichage)

Enssuite tu créé une vue a coté qui sera le modelle des items que contiendra ta ListView:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/ligne"
android:background="#0000">
<ImageView
android:id="@+id/img"
android:layout_gravity="center_vertical"
android:padding="3px"
android:layout_width="50dp"
android:layout_height="70dp"/>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:paddingLeft="3px"
android:layout_weight="1">
<TextView android:id="@+id/ids"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="ID"/>
<TextView
android:textAppearance="?android:attr/textAppearanceMedium"
android:id="@+id/nom"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="Nom"/>
<TextView android:id="@+id/description"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="Description"/>
<TextView android:id="@+id/prix"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="Prix"/>
</LinearLayout>
</LinearLayout>


Dans mon exemple se fichier sera nomé affichageitem.xml

Puis pour le code Java:
//Je recupére ma ListView
ListView LST_Produits = (ListView) findViewById(R.id.listView1);

//Je déclare un tableau de HashMap qui servira a stocké mes item avant des affiché
ArrayList<HashMap<String, String>> listItem = new ArrayList<HashMap<String, String>>();

//Je déclare un hashMap qui sera l'equivalent de mes items dans le code
HashMap<String, String> map;

//On boucle les donné recupére en JSON (pour plus d'info sur cette partie là je t'invite a lire les poste précedent)
for (int i = 1; i < MonTableauJson.length; i++) {
    	map = new HashMap<String, String>();
	map.put("img", "Le chemin de mon image"));        
	map.put("ID", "L'ID");
        map.put("nom", "Le nom");
        map.put("description", "La description");
        map.put("prix", "Le prix");
        listItem.add(map);
}

//On complete enssuite le ListView
SimpleAdapter mSchedule = new SimpleAdapter (this.getBaseContext(), listItem, R.layout.affichageitem,  new String[] {"img", "ID", "nom", "description", "prix"}, new int[] {R.id.img, R.id.ids, R.id.nom, R.id.description R.id.prix}); 	
LST_Produits.setAdapter(mSchedule);

  • 0

#17
aladin2110

  • messages 9
  • Inscrit(e) : 12 mai 2012

  • Humeur du actuel : Aucun choisi

Réputation : 0 (Neutre)
Bonsoir
désolé pour le retard
merci infiniment pour l'aider
  • 0

#18
exalid

  • messages 35
  • Inscrit(e) : 08 septembre 2012

  • Humeur du actuel : Aucun choisi

Réputation : 0 (Neutre)
A noter que sur Android afin de ne pas bloquer le main thread il est fortement conseillé d'utiliser une AsyncTask.
Cf la doc Android.
Je conseille clairement d'utiliser RoboGuice pour gérer les Async.
La méthode du dessus reste bonne ensuite perso j'utilise plutôt des HashMap mais ça revient à la même chose.

Un exemple avec les async :

public class CallWebServiceTask extends AsyncTask {
        private ProgressDialog dialog;
        protected Context applicationContext;
 
        @Override
        protected void onPreExecute() {
            this.dialog = ProgressDialog.show(applicationContext, "Calling", "Time Service...", true);
        }
 
        @Override
        protected String doInBackground(Void... params) {
 
            return Start.getTimeStampFromYahooService();
 
        }
 
        @Override
        protected void onPostExecute(String result) {
            this.dialog.cancel();
            String timestamp = Start.parseJSONResponse(result);
            timestamp = Start.UnixTimeStampToDateTime(timestamp);
            Start.this.getTxtTime().setText(timestamp);
        }
    }

Dans le preExecute tu es encore dans le main thread (UI thread) avant l'appel à la tache en background, le doInBackground comme son nom l'indique est l'endroit ou tu vas faire ton traitement qui sera dans l'async task, le postExecute te permet de récupérer ton résultat dans le main thread.

Ici ce n'est vraiment qu'un exemple, voici la page de la doc associée : http://developer.and...AsyncTask.html.
Réfères-toi à la partie "AsyncTask's generic types" et "The 4 steps" pour avoir plus de précision sur l'utilisation de ces méthodes.

Pour la gestion de la réponse passer par un buffered reader est un peu moche je trouve.

Pour des questions de performance l'utilisation du JSon est clairement conseillée mais la même chose est possible en XML.
Enfin abuse des frameworks à disposition d'Android. Le SDK commence a bien mûrir et de nombreux frameworks sont disponibles pour les développeurs.
RoboGuice facilite la vie avec l'ajout des annotations et injections de vue (super pratique plutôt que de passer par des vieux findViewByID partout dans ton code).
ORMLite et GreenDAO pour la gestion de la BDD embarquée sont plus que conseillés si jamais tu ne veux pas te coltiner les appels à la BDD via du vieux sqlite bien chiant.
A noter que ORMLite éprouve quelques problèmes en conjonction avec RoboGuice (donc du coup plutôt greendao).


Sinon pour le backoffice j'ai vu plus haut que quelqu'un parlait de php, de c++, de c, ...
Perso le php pour du webservice coté serveur, no way. On voit comment facebook a bien galéré a ses débuts avec le php, pour ensuite passer à l'HyperPhp par dépit vu que tout était déjà fait en php...
La seule chose que je puisse conseiller de ce côté la est clairement d'installer un apache, d'installer un tomcat, et roule ma poule en Java.
Y a des framework fait spécialement pour ça qui permettent de déployer une architecture sécu, restfull ou non, très vite.
Je pense notamment à Spring et plus particulièrement Spring sécurity qui sont déjà employés dans la plupart des grosses structures mondiales.
Le Java reste la référence en matière de flux sur le web, avec des outils simples et pré déployés pour les plus novices.

Modifié par exalid, 10 septembre 2012 - 13:41.

  • 0

#19
goldbergg

  • messages 176
  • Inscrit(e) : 06 octobre 2011

  • Humeur du actuel : Aucun choisi

Réputation : 51 (Se fait un nom)

Sinon pour le backoffice j'ai vu plus haut que quelqu'un parlait de php, de c++, de c, ...
Perso le php pour du webservice coté serveur, no way. On voit comment facebook a bien galéré a ses débuts avec le php, pour ensuite passer à l'HyperPhp par dépit vu que tout était déjà fait en php...
La seule chose que je puisse conseiller de ce côté la est clairement d'installer un apache, d'installer un tomcat, et roule ma poule en Java.
Y a des framework fait spécialement pour ça qui permettent de déployer une architecture sécu, restfull ou non, très vite.
Je pense notamment à Spring et plus particulièrement Spring sécurity qui sont déjà employés dans la plupart des grosses structures mondiales.
Le Java reste la référence en matière de flux sur le web, avec des outils simples et pré déployés pour les plus novices.

Le PHP a beaucoup de cas particulié en fonction de l'OS, de la verssion (fast-cgi,...) et du compilo qui a servi pour généré les binaire(bon ca sa ne concerne que windows) (plus d'info sur la conf PHP de la techday 2012)
de plus php propose aussi d'exelent framework, on a même des ORM qui introduise linq !

Tu dit que java est la reference, j'ai entendu la même concernant l'ASP.NET.
En se moment dans la boite dans lequel je bosse je fais justement de l'ASP et certe c'est puissant, en 10 sec montre en main(et sans exagérer) je code un WS compatible REST et SOAP et que me générer du XML ou du JSON en fonction du Content-Type de ma requette...
(et le tous sans framework particulié bien sur, ni configuration, juste une simple fonction toute conne dans un fichier asmx ou wcf)
Bref juste pour dire y aucune techno au dessus de toute les autre, juste de preference, et de toute facon en entreprise généralement on nous l'impose!


(et dans le cas de se topic, se qui importe c'est la conception, le code on s'en fiche un peu)

Modifié par Nesse1040, 13 septembre 2012 - 06:03.

  • 0

#20
exalid

  • messages 35
  • Inscrit(e) : 08 septembre 2012

  • Humeur du actuel : Aucun choisi

Réputation : 0 (Neutre)

et Facebook n'est certainement pas une reference pour le PHP... (surtous que PHP a beaucoup de cas particulié en fonction de l'OS, de la verssion (fast-cgi,...) et du compilo [...]


Minute. Le PHP n'est pas un langage compilé, c'est un langage interprété. A la limite "tokenisé".
Pour le cas de Facebook, c'est une référence pour la charge sur les serveurs. Puisqu'effectivement Facebook est une des plus grosse plateforme qui utilisait du PHP.
Tu peux effectivement faire tout ce que tu veux avec n'importe quoi. Même t'amuser à faire du soap en asm. Il est ici question de performance. Quand on considère que le Java est une surcouche C, effectivement, théoriquement le C devrait être plus performant. Le problème c'est qu'en pratique, le Java est plus riche en terme de communauté et de framework à disposition (ce qui est lié à la communauté de développeur quelque part).
Tu as l'air de vouloir causer techno et usage, why not, je vais être bref pour ne pas trop dériver du sujet qui est l'utilisation de webservice côté serveur et client.
Effectivement, l'usage est important. Un tier ne va pas développer son site web en Java (dans ce cas un coup de PHP est bien plus rapide et simple niveau déploiment). A contrario une ss2i de 15000 collaborateur ne va pas déployer une plateforme web à la sncf en PHP.
La guéguerre du petit dev auto entrepreneur qui déploie des petites plateformes pour son client et du petit ingénieur qui travaille pour une grosse société de service est totalement puérile.

Chaque langage à son usage, chaque usage à son client.

Ce que j'entendais par l'utilisation du Java, c'était le déploiement de plateforme de grosse ampleur. Dans ce cas précis, le premier critère reste la performance. L'optimisation des coûts est la première préoccupation de tout le monde.
Perso je vois plus de plateforme qui offre des entry point sur des WS en Java ou .NET, que des plateformes en PHP.
En toute honnêteté je ne me lancerai pas dans du webservice sécu en PHP. Déjà que la gestion de certificat de sécu est horrible même en Java (le setup des http conduit avec le paluchage des Keystore et des Truster notamment) alors en PHP sur du gros webservice complet, j'imagine même pas. Et encore je ne parle pas de déploiement selon les environnements (dev, qualif, prod).

Donc perso, tous les langages OK, mais intelligemment et selon le besoin.

En se moment dans la boite dans lequel je bosse je fais justement de l'ASP et certe c'est puissant, en 10 sec montre en main(et sans exagérer) je code un WS compatible REST et SOAP et que me générer du XML ou du JSON en fonction du Content-Type de ma requette...


Y a un mais ? Je comprends pas bien ta phrase.

Modifié par Nesse1040, 13 septembre 2012 - 06:12.

  • 0

#21
goldbergg

  • messages 176
  • Inscrit(e) : 06 octobre 2011

  • Humeur du actuel : Aucun choisi

Réputation : 51 (Se fait un nom)
Pour PHP je parle de la compilation des source (et au passage un code PHP peux être compilé, tous comme il peut être utilisé en CLI les utilisation d'un language ne se limite pas forcement a celle que l'on connait le mieux), il a été prouvé (pour les verssion windows en tous cas) que les binaire proposé (officiellement) ne proposais pas tous les même perf(pour une même verssion de PHP) et je parle de différence énorme.

Tu as l'air de vouloir causer techno et usage, why not, je vais être bref pour ne pas trop dériver du sujet qui est l'utilisation de webservice côté serveur et client.

Pas du tous et le sujet c'est la conception d'un WS pas l'utilisation, les extrait de code fourni ne sont qu'un exemple pour ceux qui aimerais voire a quoi sa ressemble simplement.
Se topic n'a pour seul but d'aidé un debutant (dans le domaine des WS REST) a concevoire un WS en fonction de sont besoin.
J'aimerai simplement evité de partir en HS sur un debat qui est a coté de la plaque.

Y a un mais ? Je comprends pas bien ta phrase.

Oui autant pour moi, en faite j'ai modifier mon poste a plusieur rerprise car je le trouvé trop agressif et j'ai oublié de faire certaine correction, en faite je voulai dire que malgré les perf, la simplicité, etc... de la platforme .NET sa n'était pas pour autant que c'était THE réfférence malgré les avantage, il y a certaine chose que je fais beaucoup plus facillement en PHP par exemple.
En gros le message que je voulais faire passé, c'est qu'aux dela des message marketing comme quoi tel techno c'est la reference etc... il n'y aucun language qui surpace les autre ni de techno qui surpace les autre, on a juste des chose plus ou moin adapté a certain besoin.

Modifié par goldbergg, 13 septembre 2012 - 18:23.

  • 0

#22
toninio23

  • messages 1
  • Inscrit(e) : 09 mars 2013

  • Humeur du actuel : Aucun choisi

Réputation : 0 (Neutre)
Hello,

ton lien pour le téléchargement de ton fichier ZIP ne fonctionne plus,
est ce que tu pourrais le mettre en download.

J'ai un projet pour mon travail de concevoir un WebService avec Rest, je ne comprends pas tout pour l'instant et je pense que ton code pourrait m'aider énormément.

D'avance merci pour ta réponse, avec mes meilleures salutations.

Toninio23
  • 0

#23
Tornado

      God’s in his heaven, all’s right with the world

  • messages 1 067
  • Inscrit(e) : 19 janvier 2012

  • Humeur du actuel : Vegged Out

Réputation : 75 (Se fait un nom)
Quand je vois la complexité de la chose, c'est là où je me dis que j'ai bien fais de pas prendre développement (avec du web service) comme option.
  • 0

131222073057808347.png

Spoiler

#24
goldbergg

  • messages 176
  • Inscrit(e) : 06 octobre 2011

  • Humeur du actuel : Aucun choisi

Réputation : 51 (Se fait un nom)
http://goldbergg.free.fr/FILES/

Dans se lien il y a deux fichier, le ressource avec les code de base et Uwamp, c'est un server wamp preconfigurer avec le WS

Je suis désolé pour les liens, il y a un blaireau qui s'amuse a piraté mon server, il a toujour pas compris que je ne l'utilisé plus, normalement d'ici le moi prochain je devrais avoir mon nouveau server avec cette fois beaucoup plus de protection contre les attaque

si les liens repante d'ici la contacté moi par MP pour me prevenir
  • 0

#25
begin

  • messages 1
  • Inscrit(e) : 30 août 2013

  • Humeur du actuel : Aucun choisi

Réputation : 0 (Neutre)

Bonsoir,

 

Recherchant de la documentation sur les WerServices, je constate malheureusement que le fichier Ressource.zip n'est plus accessible...

 

 

Merci !


  • 0

#26
goldbergg

  • messages 176
  • Inscrit(e) : 06 octobre 2011

  • Humeur du actuel : Aucun choisi

Réputation : 51 (Se fait un nom)

Bonjour,

 

Voici le lien que je vien de réup:

 

Et voici un package avec Uwamp préconfigurer et pres a l'emploie


 
EDIT: Les source sont aussi consultable en ligne ici (en beta) : http://gold-s.fr/Lab...RCES/WEBSERVICE

Modifié par goldbergg, 10 septembre 2013 - 09:58.

  • 0

#27
mambokido

  • messages 1
  • Inscrit(e) : 30 décembre 2013

  • Humeur du actuel : Aucun choisi

Réputation : 0 (Neutre)

Bonjour,

 

Merci pour ce tuto.

Je suis débutant dans la programmation (PHP) et je voulais justement tester de créer un webservice REST en PHP. Cependant j'ai une question sans réponse sur Google.

Je suis en train de développer une application mobile (HTML5/jQuery Mobile/PhoneGap). Je voudrais donc consommer mon futur WS depuis mon webapp mais je souhaiterais que seul mon webapp ait l'autorisation de le faire. Et là, je sèche complétement. Pouvez-vous m'aider ou m'indiquer des liens ?

 

Merci encore pour ce tuto. (je vais le tester demain :) ).

 

A bientôt


  • 0

#28
samir_822002

  • messages 2
  • Inscrit(e) : 11 octobre 2016

  • Humeur du actuel : Aucun choisi

Réputation : 0 (Neutre)

serait il possible de recuperer http://jheberg.net/captcha/ressource/
et http://jheberg.net/captcha/uwamp/

ces fichiers là n'existent plus mnt! svp

 

 


  • 0

#29
samir_822002

  • messages 2
  • Inscrit(e) : 11 octobre 2016

  • Humeur du actuel : Aucun choisi

Réputation : 0 (Neutre)

Hello,

ton lien pour le téléchargement de ton fichier ZIP ne fonctionne plus,
est ce que tu pourrais le mettre en download.

J'ai un projet pour mon travail de concevoir un WebService avec Rest, je ne comprends pas tout pour l'instant et je pense que ton code pourrait m'aider énormément.

D'avance merci pour ta réponse, avec mes meilleures salutations.

Toninio23

 

 

serait il possible de recuperer ressource.zip
et uwamp

ces fichiers là n'existent plus mnt! svp


Hello,

ton lien pour le téléchargement de ton fichier ZIP ne fonctionne plus,
est ce que tu pourrais le mettre en download.

J'ai un projet pour mon travail de concevoir un WebService avec Rest, je ne comprends pas tout pour l'instant et je pense que ton code pourrait m'aider énormément.

D'avance merci pour ta réponse, avec mes meilleures salutations.

Toninio23

 

 

serait il possible de recuperer ressource.zip
et uwamp

ces fichiers là n'existent plus mnt! svp


serait il possible de recuperer ressource.zip
et uwamp

ces fichiers là n'existent plus mnt! svp


serait il possible de recuperer ressource.zip
et uwamp

ces fichiers là n'existent plus mnt! svp


serait il possible de recuperer ressource.zip
et uwamp

ces fichiers là n'existent plus mnt! svp


  • 0

#30
goldbergg

  • messages 176
  • Inscrit(e) : 06 octobre 2011

  • Humeur du actuel : Aucun choisi

Réputation : 51 (Se fait un nom)

Bonjour,

Les fichiers ressource sont dispo ici : http://gold-s.net/La...RVICE/ressource 
(le package UWAMP n'est plus dispo, il est devenue obsoléte)

Attention, si l'architecture pour créer des WS REST n'a pas changer, le code JS (vielle version de jQuery) ainsi que la partie connexion à la BDD en PHP (utilisation des ancienne api mysql) sont obsolètes.

Je n'est actuellement pas le temps pour réactualisé tous ça.
 


  • 0





0 utilisateur(s) dans ce forum

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)

Community Forum Software by IP.Board
Licence accordée à : AnimeServ.NET
Design & Code by Bad.Y o/
© 2013 AnimeServ