Human-centric web : B2C (business ToConsumer) Le Web centré utilisateur implique que l’humain est l’acteur principal pour l’initialisation de l’ensemble des requêtes
Ch1 : Introduction aux services web :
Application-centric web : B2B : Le Web centré application a pour objectif de permettre à des applications de différentes organisations de communiquer entre elles
Evolution des paradigmes : Le terme de paradigme est employé pour exprimer la façon dont un système a été conçu et pensé dans ses grandes lignes. => Développer une application de facturation.
1. Paradigme procédural : Le programme est une liste des tâches et des opérations à exécuter. (exemple c )
Tend à générer du code "Spaghetti "
- - Maintenance complexe - Modularité et abstraction absente -
Réutilisation ardue
2. Paradigme objet : changer le programme de lignes de code séquentiellement en des objets qui dialoguent
(exemple : java ) ( encapsulation/de données/polymorphisme/héritage)
- -
Réutilisation difficile Couplage fort -> rend difficile la maintenance
3. Paradigme composant : Construire une application composée par un ensemble de briques de base configurables.
Il s'agit d'externaliser le code fonctionnel d'une application afin de le rendre réutilisable dans d'autres applications.
-
Interopérabilité entre composants hétérogènes
4. Paradigme service : •Prise en charge de la diversité l’hétérogénéité des systèmes et de logiciels, en termes de
langages de programmation, de technologies de conception (et de réalisation) ou de plates-formes d’exécution. + réduire le couplage + améliorer la réutilisation + augmenter l’abstraction
Interoperability : 2(ou plus) systèmes fonctionnent ensembles inchangés même s’ils n’étaient pas nécessairement conçus pour fonctionner ensembles
Integration : signifie qu’on écrit du code personnalisé pour connecter deux (ou plus) systèmes ensembles.
Intégration, Interopérabilité – Comment ?
Middleware(intergiciel) : Les logiciels servant d'intermédiaire entre d'autres logiciels ;
Un intermédiaire de communication entre des applications complexes et distribuées -Rôles : - Résoudre l’intéropérabilité : Unifier l’accès à des machines distantes -Résoudre l’hétérogénéité : Être indépendant des systèmes d’exploitation et du langage de programmation des applications
1
Service Web : software system , conçu pour prendre en charge l’interopérabilité de machine à machine sur un réseau (network)
Interagissent à travers l’échanges de messages 2 familles se services web : - Les services web étendus (SOAP/WSDL)
– Les services web REST
SOA : L’architecture orientée service constitue un style d’architecture basée sur le principe de séparation de l’activité métier en une série de services. Ces services peuvent être assemblés et liés entre eux selon le principe de couplage lâche pour exécuter l’application désirée.
Caractéristiques d’un service : contrat standardisé / couplage lâche / abstraction / réutilisabilité / autonomie/ sans état / découvrable / composable
Ch2 :XML (eXtensible Markup Language)
(Langage de structure de données)
On doit organiser d'une certaine manière les données ce qui permet un traitement automatique de ces dernières plus efficace et rapide => utilisation d’une structure de données
Structure de données :
- -
Une organisation des informations Est destinée à contenir des données , afin de leur donner une organisation permettant de simplifier leur traitement
Baisser la complexité d’une application informatique et diminuer le taux d’erreurs
Différentes structures de données : tableau / liste chainée / arbre
Les documents structurés sont des documents qui contiennent de l'information à propos de leurs structures logiques et physiques :
- Structure physique : apparence visuelle (texte sur deux colonnes, texte justifié ou non, etc.)
- Structure logique : organisation du contenu intellectuel du document (chapitre, section, sous-section, etc.)
Les langages les plus couramment utilisés permettant d’encoder un document structuré à l’aide des balises sont : SGML/HTML/XML
SGML : diffusion électronique de documents –syntaxe complexe
HTML : présentation des documents sur le web – non flexible, figé
XML : structuration , échange des documents : +plus simple que SGML + plus souple que HTML
Pourquoi XML :
Lisible : texte balisé avec marquage. Extensible : supporte les évolutions applicatives.
Mise en forme avec des feuilles de style. Un méta langage permettant la définition de langages adaptés à des besoins variés.
Supporté par les grands constructeurs : IBM, Microsoft .net,SUN, etc.
Arborescence XML
L’arborescence d’un document XML est la structure hiérarchique des nœuds (composé de plusieurs nœuds)
Structure d'un document XML : comporte :
-une prologue.
-l'arbre des éléments.
-éventuellement des commentaires
2
1.
Le prologue :
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> (facultative mais fortement conseillée) -la version du langage XML -> version= « 1.0 » - le codage des caractères (par défaut UTF-8) -> encoding = « UTF-8 » - La dépendance à des documents extérieurs -> standalone= « yes »
2.
Les nœuds XML :
Les éléments : s’ouvre et se ferme par une balise : <categorie>Nom-élément</categorie> Les attributs :
- - -
L’attribut se trouve dans la balise ouvrante d’un élément Un élément peut contenir plusieurs attributs Un même attribut ne peut pas être présent qu’une seule fois dans un élément <quantite unite ="g" >100</quantite>
Les entités : Certains caractères ont un sens particulier en XML, &entite ; Les entités prédéfinies : & ; => & / &it ; => < / > ; => > / " ; => ‘’ / &aquot => ‘ Exemple : <message>salaire < 1000</message>
3.
Les commentaires : <!-- This is a comment -->
Les règles syntaxiques :
Un document XML a un seul élément racine.
XML est sensible à la casse : <Categorie>incorrect</categorie>
• Un élément peut :
- - -
Être vide : <vide/> Contenir une chaine de caractères : <categorie>Dessert</categorie> Contenir des éléments fils (qui doivent être correctement imbriqués) : <ingredient> <nom>beurre</nom> <quantite>100</quantite> </ingredient>
Exemple :
<?xml version version="1.0"? encoding="ISO-8859-1" standalone="yes"?>
<MOTEURS> // racine
<MOTEUR marque = "Peugeot"> // marque : attribut
<PUISSANCE>5</PUISSANCE>
<CYLINDREE>1.2</CYLINDREE>
des élements
<CARBURATION>Essence</CARBURATION >
</MOTEUR>
<MOTEUR marque = "Renault">
<PUISSANCE>4</PUISSANCE>
<CYLINDREE>1.3</CYLINDREE>
<CARBURATION>Diesel & Diesel</ CARBURATION >
</MOTEUR>
</MOTEURS>
Un document XML est valide (respect la syntaxe XML) si et seulement s’il est bien formé (respect une grammaire :
respect des règles XSD)
3
Grammaire :
Une DTD (Document Type Definition) est une grammaire qui permet de définir une structure type de document XML.
XSD : XML Schéma est un langage de description de format de document XML permettant de définir la structure et le type de contenu d'un document XML.
Définir la structure d’un document XML pour que tous les intermédiaires suivent le même modèle grâce aux schémas XSD
Ch3 : XSD : XML schéma définition
XSD définit :
• Les éléments permis dans le document
• Les attributs associés à ces éléments
• La structure du document et les types de données
Tous les outils (validateurs, parseurs, processeurs, ...) mais également les langages (XSLT, XPath, ...) qui permettent de travailler les documents XML sont utilisables sur des XSD.
XSD : extension *xsd
<?xml version="1.0" ?>
<xs:schema xmlns:xs= « http://www.w3.org/2001/XMLSchema »>
..
</xs:schema>
L’élément <xs:schema> est la racine de tout document Schema XML
Déclaration des éléments : <xs:element name="theName" type="theType" />
- -
Valeur par défaut : <xs:element name="firstName" type="xs:string" default ="Mickael" /> Valeur fixée : <xs:element name="firstName" type="xs:string" fixed="Mickael" />
Déclaration des attributs :<xs:attribute name="theName" type="theType" use="required/optional"/>
- -
Valeur par défaut Valeur fixée
- -
Les attributs sont de types simples Les éléments sont de: Types simples : ne peut contenir ni attributs, ni de sous éléments Types complexes : peut contenir des attributs et des sous éléments
Les types simples :
1- Prédéfinis : xs : int/ boolean/ string / long / float /positiveInteger :1,2,.. / negativeInteger ..,-2,-1 / nonNegativeInteger
0,1,2,./ nonPositiveIntegre ..,-2,-1,0 / unsignedLong 0,1 …..
2- Restriction (dérivés) : On peut créer de nouveaux types simples en dérivant des types simples existants
Un nouveau type simple peut être défini par restriction ou extension Exemple : âge entier entre 1 et 100
Les restrictions passent par l’utilisation des facettes : permet de définir des contraintes sur le nouveau type à créer
Création :
<xs:simpleType name="newType" > //nouveau type simple
<xs:restriction base="type" > // type simple de départ
4
...
</xs:restriction>
</xs:simpleType>
Les principales facettes :
-
-
-
-
-
Facette length : <xs:element name=" password" type ="passwordType" /> <xs:simpleType name ="passwordType" > <xs:restriction base="xs:string"> <xs:length value="8"/> </xs:restriction> </xs:simpleType> Facette minLength, maxLength : <xs:minLength value="5"/> <xs:maxLength value="8"/> Facette minLInclusive, minExclusive, maxInclusive, maxExclusive : <xs:minInclusive value="1"/> <xs:maxInclusive value="100" /> Facette énumération : 3 valeurs sont autorisées : <xs:enumeration value="homme" /> <xs:enumeration value="femme" /> <xs:enumeration value="indéterminé" /> Facette pattern : <xs:pattern value= " [a-z]*@[a-z]* " />
Les Types complexes :
- - - -
Eléments vides qui ne contiennent que des attributs Eléments de type simple qui contiennent des attributs Eléments qui peuvent contenir des sous éléments Eléments qui contiennent des attributs et des sous éléments
Création :
<xs:complexType name="newType" >
...
Publicité
</xs:complexType>
Éléments vides qui ne contiennent que des attributs :
<xs:element name="child" type ="childType" />
<child remark="He's too much" old="3" sexe="homme"/>
<xs:complexType name ="childType" >
<xs:attribute name="remark" type="xs:string" use="required" />
<xs:attribute name="old" type= "xs:int" />
<xs:attribute name="sexe" type="xs:string" />
</xs:complexType>
Éléments qui peuvent contenir des sous éléments :
<person>
5
<name>...</name>
<firstName>...</firstName>
<old>...</old>
<email>...</email>
</person>
Indicateurs d’ordre : sequence / all/ choice
<xs:element name="person" type="personType " />
<xs:complexType name="personType " >
<xs:sequence>
<xs:element name="name" type="xs:string" />
<xs:element name="firstName" type="xs:string" />
<xs:element name="old" type="ageType" />
<xs:element name="email" type="emailType" />
</xs:sequence>
</xs:complexType>
Sequence : exprime que les sous éléments doivent apparaitre dans l’ordre spécifié
All : tous les sous éléments peuvent apparaître dans n'importe quel ordre
Choice : exprime qu'un seul élément parmi tous les sous éléments peut apparaître
Même si on a un seul élément fils, on doit utiliser un indicateur d’ordre.
Indicateurs d’occurrence :
maxOccurs : précise le nombre d'occurrence maximum
minOccurs : précise le nombre d'occurrence minimum
Si les valeurs de maxOccurs ou minOccurs ne sont pas explicitement précisées, la valeur par défaut est de 1/ Pour définir une valeur infinie, fixer la valeur à unbounded
<xs:element name="old" type="ageType" minOccurs="0" /> //old est un élément optionnel
<xs:element name="email" type= " emailType" minOccurs="2" maxOccurs="unbounded"/>
Éléments qui peuvent contenir des sous éléments et des attributs :
<person id ="139" >
<name>...</name>
<xs:complexType name= "personType">
<xs:sequence>
<firstName>...</firstName>
<xs:element name="name" type="xs:string" />
<old>...</old>
<email>...</email>
</person>
L’héritage en XSD :
<xs:element name="firstName" type="xs:string" />
<xs:element name="old" type="ageType" />
<xs:element name="email" type= "emailType" />
</xs:sequence>
<xs:attribute name="id" type="xs:int" />
</xs:complexType>
Héritage d’un élément simple : Possibilité de définir un nouveau type sur la base d'un type simple existant <xs:simpleContent>
6
Héritage d’un élément complexe : Possibilité de définir un nouveau type complexe sur la base d'un type complexe existant.
<adress>
<receiver></receiver>
<street></street>
<city></city>
</address>
Utilisation de la balise <xs:complexContent> :
<xs:complexType name="addressType">
<xs:sequence>
<xs:element name="receiver" type="xs:string" />
<xs:element name="street" type="xs:string" />
<xs:element name="city" type="xs:string" />
</xs:sequence>
</xs:complexType>
Espace de noms XML :
<adressUS>
<receiver></receiver>
<street></street>
<city></city>
<state></state>
<zip></zip>
</adressUS>
<xs:complexType name="usAddressType">
<xs:complexContent>
<xs:extension base="addressType">
<xs:sequence>
<xs:element name="state" type="xs:string" />
<xs:element name="zip" type="xs:string" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
Pour Distinguer les éléments et les attributs de différentes documents XML qui ont le même nom : Utiliser les espaces de noms XML.
URI: http://emplo ye.com
Préfixe: emp
7
URI: http://departe ment.com
Préfixe: dep
Déclaration des espaces de noms : <element xmlns:prefix="URI">
Un espace de nom associe un préfixe à un URI
L’URI (Uniform Resource Identifier) sert à identifier un espace de noms Le préfixe est une chaîne utilisée pour référencer l’espace de nom dans un fichier XML. <emp:employe xmlns:emp="http://emloye.com"> <emp:id>E0000001</emp:id> <emp:nom>Smith</emp:nom> <emp:prenom>John </emp:prenom> </emp:employe>
Fusion des 2 documents : <entreprise xmlns:dep="http://departement.com" xmlns:emp="http://emloye.com" > <dep:departement> <dep:id>D001</dep:id> <dep:nom>Marketing</dep:nom> <emp:employe> <emp:id>E0000001</emp:id> <emp:nom>Smith</emp:nom> <emp:prenom>John </emp:prenom> </emp:employe> </dep:departement> </entreprise>
Espace de nom pour XSL :
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
...
</xsl:stylesheet >
Espace de nom pour XSD :
<?xml version="1.0" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
…
</xs :schema>
8
Espace de noms XSD :
xmlns:dep = espace de nommage des nouveaux types
xmlns:xs = espace de nommage des éléments et types
XSD définis par le programmeur XSD cible / C’est l’espace de noms qui sera référé par le fichier XML
targetNamespace = espace de nommage du schema
Association d’un fichier XML à un fichier XSD : (passe par l’utilisation des espaces de noms)
xmlns = Espace de noms des éléments utilisés dans le fichier XML xmlns:xsi = Il s’agit d’une instance de schema XSD xsi:schemaLocation =Localiser le document XSD
Ch4 : JAX-B
- - -
Java Architecture for XML Binding JAX-B est un API Java permettant la gestion de données XML. JAX-B permet plus particulièrement l'utilisation du "Data Binding" : Le Data Binding est une technologie permettant d'automatiser la transformation des fichiers XML en objets Java et inversement.
Java
Data Binding
(JAX-B)
XML
Sérialisation désérialisation
JAX-B permet deux types de transformations : Classes java<--> Schéma XML Instances de classes <-->java XML JAX-B est utilisé par : JAX-WS : Les applications JAX-WS utilisent JAX-B pour la conversion de données entre les classes Java et, WSDL et SOAP. JAX-RS : Les services web RESTful utilisent JAX-B pour la transformation des données échangées en XML
- -
-
-
Avantages :
- -
- -
Génération de classes automatisée : Gain de temps pour l'utilisateur Meilleur intégrité des données : JAX-B comporte des outils chargés de vérifier l'intégrité des données reçues. Lorsqu'une erreur intervient, le système pourra lever des exceptions Validation des documents XML Gestion de la persistance de données stockées sous format XML : La redistribution des données consiste à récupérer le contenu de chaque instance de classe et de les insérer dans les fichiers XML
Types de données :
Type de données prédéfinis :
Type java <--> type XSD : boolean <-> boolean /float <->float /int <-> int / string<->string/Objetc<->anyType ….
9
Types de données définis par l’utilisateur :
Javabean <-> <xsd :complexType>
Variable de javabean <-> Un élément sous <xsd:complexType>
Variable de Javabean de type List <-> Un element sous <xsd:complexType> avec l’attribut maxOccurs=“unbounded”.
Utilisation :
Génération des classes à partir d’un schéma :
- -
Publicité
L'outil xjc permet de générer les classes à partir d'un schéma XML (xjc personne.xsd) Les classes générées :
Personnes.java : classe qui encapsule le document XML
ObjectFactory.java : fabrique qui permet d'instancier la classe Personne
Génération d’un shéma à partir d’une classe java :
- -
L'outil schemagen permet de générer le schéma XML à partir d'une classe (shemagen personne.java) Les fichiers générés :
Personne.class : Bytecode de la classe Personne compilée Schema1.xsd : fichier XSD correspondant
Génération d’un document XML à partir d’une instance Java (sérialisation/marshalling) :
1. Ajouter les annotations nécessaires à la classe java 2. Utiliser la classe Marshaller de l’API JAX-B pour générer le document XML à partir des objets déjà créés.
Mapping d’un document XML à des objets (desérialisation/unlarshalling) :
L'API JAX-B propose de transformer un document XML en un ensemble d'objets qui vont encapsuler les données et la hiérarchie du document. Ces objets sont des instances des classes générées à partir du schéma XML.
Annotations JAX-B :
Les annotations JAX-B utilisées dans les classes java permettent la génération et la personnalisation :
Des schémas XSD générés Des documents XML générés
Les annotations JAX-B sont définies dans le package javax.xml.bind.annotation => import javax.xml.bind.annotation.*;
- @XmlRootElement : spécifier la racine du document XML - @XmlElement : convertir une propriété de la classe en un élément dans xml - @XmlAttribute : convertir une propriété de la classe en un attribut - @XmlTransient : retire des éléments pris en compte pour la création des schémas et des documents XMl(ignorer
l’élément de fichier XSD)
- @XmlType : permet de fixer l’ordre dans lequel les champs de cette classe doivent être enregistrés dans le doc
XML
- @XmlAccessorOrder : contrôler l’ordre des attributs et des propriétés dans la classe - @XmlSchema : Associer un espace de noms à un paquetage
10
Atelier :
Java-> XSD :
1- Créer un fichier Marven en fixant group id et artifical id 2- On va trouver dans le fichier crée : src/main/java ou on va créer le code source pom.xml c’est un fichier de configuration où on va ajouter les dépendances qu’on a dans le projet , on va spécifier qu’on va utiliser le jax-B pour l’ajouter dans le projet , pour faire les imports nécessaires(les dépendances) , c’est pour cela qu’on ajoute dans ce fichier à l’intérieur de balise <Project>(pour préciser qu’on va travailler avec jaxb) : Ajouter les dépendances et les propriétés 3- Il faut update le projet pour qu’il prend en considération les
- -
-
modifications.
4- Création d’un fichier marven Dependences où on trouve les dépendances qui sont déjà déclarés dans pom.xml 5- Créer la class dans src/main/java avec @XmlRootElement
Exemple getter and setter :
public String getFrom() { return from;
} public void setFrom(String from) {
this.from = from;
Exemple constructeur :
public Message(String from) {
super(); this.from = from; }
6- Génération d’un fichier XSD à partir de la classe Message :
a- Placer sous le package qui contient la class puis exécuter la commande ‘’schemagen nom-class’’ b- Pour avoir la modification : on appuie sur refresh
11
@XmlElement(name="sender" ,required=true)
public String getFrom() { return from;
}
Génération d’une instance java à partir d’un document xml et inversement (marshalling / Unmarshalling) (exemple)
Marshalling (java-> xml) :
-
Créer la classe MarshallineMessage
Marshalling (xml-> java) :
Ch5 : JAX-RS, web service REST (REpresentational State Transfert)
REST est un style d’architecture inspiré de l’architecture du Web pour construire des services web.
REST est une alternative aux services web étendus (SOAP)
-
Une architecture : contient tous les composants sans exception, elle contient plusieurs protocoles de transport http , ftp .. , contenir plusieurs méthode de n’importe quels nom , elles peuvent être personnalisées à 100% .
Tout est personnalisable dans une architecture. -
Un style d’architecture : un ensemble de contraintes qui permettent, lorsqu’elles sont appliquées aux composants d’une architecture, d’optimiser certains critères propres au cahier des charges du système à concevoir.
REST n’est pas un format, un protocole ou un standard mais il utilise des standards : http – URL – XML/HTML
-
-
- -
REST est léger et simple : Les messages sont courts, faciles à décoder par le navigateur et par le serveur d’application. REST est auto-descriptif : vous pouvez naviguer à travers ses ressources comme vous le feriez avec une page Web. Il y a une URL intuitive unique pour chaque ressource. On peut facilement en déduire la structure des ressources sans avoir besoin de beaucoup de documentation. REST est stateless : Consommation de mémoire inférieure REST peut être géré en cache : mise en cache possible donc meilleure montée en charge
Principes de REST :
URI
Identifie
Ressource
Représentation
Représente
12
Une ressource Un identifiant unique de la ressource (URI/URL (URL appartient à la famille de URI)) Une représentation de la ressource (XML / JSON ...)
Interagir avec les ressources : Requêtes HTTP : GET, POST, PUT et DELETE
Ressources (Identifiant)
Identifié par une URI : Exemple : http://localhost:8080/libraryrestwebservice/books
Méthodes (Verbes) : pour manipuler la ressource
-
Méthodes HTTP : GET, POST, PUT and DELETE Une ressource quelconque peut subir quatre opérations de base désignées par CRUD qui vont être exprimés par les méthodes http (REST s’appuie sur le protocole http) :
1- Créer -> POST
2-
Lire -> GET
3- Supprimer -> DELETE
4- Mettre à jour -> PUT
HTTP Status Codes : 1XX -> informational / 2XX -> success / 3XX -> Redirection / 4XX -> Client ERROR / 5XX -> Server Error
Représentation : - - -
donne une vue sur l’état de la ressource informations transférées entre le client et le serveur Exemples : XML, Text, JSON, ... Fournir les données suivant une représentation pour:
• •
le client (GET): format de sortie le serveur (PUT et POST): format d’entrée
13
-
Le format d’entrée (PUT et POST) et le format de sortie (GET) d’un service Web d’une ressource peuvent être différents
WADL : (Web Application Description Language) (un contrat standard : le client pour peut utiliser le service il doit comprendre le contrat) :
WADL -> style d’architecture (puisque on voit une application d’un service web et non pas tout le service web) / WSDL -> architecture
- - -
Est un langage de description XML de services de type REST L’objectif est de pouvoir générer automatiquement les APIs clientes d’accès aux services REST Peu d’outils exploite la description WADL (puisque dans REST tous les méthodes sont prédéfinies => on n’a pas besoin de comprendre comment un service fonctionne)
Services Web REST avec Java : JAX-RS: Java API for RESTful Web Services
Spécification décrivant la mise en œuvre et la consommation des services web REST
JAX-RS est basé sur les annotations :
@Path : définit le chemin de la ressource. Cette annotation se place sur la classe et/ou sur la méthode
implémentant le service.
@GET, @PUT, @POST, @DELETE : définit l’action implémentée par le service @Produces : spécifie le type de la réponse du service @Consumes : spécifie le type accepté en entré du service
Différentes implémentations de JAX-RS sont disponibles :
• • • •
JERSEY (Oracle) CXF (Apache) RESTEasy (JBoss) RESTlet
Seule l’approche bottom-up est possible
• •
Annoter une classe POJO Compiler et déployer
4 : optionnel
Comparaison entre REST et SOAP
14
Le paramétrage : utilisation des paramètres :
Est-ce qu’on peut avoir la même annotation utilisée dans le même chemin ? par exemple, une méthode @GET sans paramètres et une méthode @GET avec QueryParam ? Non, on n’a pas le droit d’avoir deux méthodes qui accèdent à une même ressource parce que le programme (le serveur) ne peut pas savoir quelle méthode considérée par le client (il ya pas une confusion avec pathparam puisque il impose / )
Solution :
1- Utiliser pathparam 2- Combiner les deux méthodes qui posent un problème dans une seule méthode avec des conditions
Atelier jax-RS :
Localhost :8018
0- 1- Ajouter les propriétés et les dépendances : 2- Créer une classe et on ajoute entends Application pour dire qu’elle s’agit d’une application et non d’une ressource
(la classe main qui va activer toute l’application)
3- Créer une classe pour définir la ressource :
Finaliser le chemin URL : localhost :8012/nomProjet/rest/greeting 4- Puis on commence avec les méthodes :
-
-
localhost :8012/nomProjet/rest/greeting/nada/fennani
15
localhost :8012/nomProjet/rest/greeting ?FirstName=nada&LastName=fennani
QueryParam n’entre pas dans le chemin => confusion avec la méthod1 (sans paramètre )
Atelier jax-RS crud (suite atelier jax-RS)
Lorsqu’on a les ressources, le Marshelling et le Unmarshelling se fait automatiquement.
hashCode () est utilisée pour déterminer où stocker et où chercher l'objet en interne.
equals () est utilisée dans la plupart des collections pour déterminer si une collection contient un élément donné.
-
On va utiliser un client REST pour consommer correctement les web services : Postman => lancer postman : assurer l’envoie des données (XML)
Ou return Response.status(Status.OK).entity(ListeEmploye).build() ;
16
Ou return Response.status(Status.CREATED).entity(‘’add successful ‘’).build() ; lorsque le retour de méthode est Response.
Liste.size()-1 => return the last element
Ch6- JAX-RS-sécurité
17
JWT : JSON Web Token
-
-
-
-
JWT est un standard, définit une solution, compacte et autonome, Permet de transmettre de manière sécurisée des informations entre les applications en tant qu'objet structuré au format JSON. Compact ? En raison de leur petite taille, les JWT peuvent être envoyés via une URL, un paramètre POST ou dans un en- tête HTTP. Petite taille => transmission rapide Autonome ? Le JWT contient toutes les informations requises sur l'utilisateur, Ce qui évite d'avoir à interroger la base de données plus d'une fois pour connaitre le détail de l’identité d’un client authentifié. Structure : Header . Payload . Signature => XXX .YYY . ZZZ : 3chaines base64 séparées par des points
Publicité
1- Header :
L'en-tête se compose généralement de deux parties : o Le type du jeton, qui est JWT, o L'algorithme de hachage utilisé, tel que : HMAC (HS512, HS256, HS384) ou RSA
La structure du Header est un objet JSON ayant la forme la suivante :
{ "alg": "HS256",
"typ": "JWT"
}
• Cet objet JSON est ensuite encodé en Base64URL.
2- Payload : est encodé en Base64URL. Elle contient les claims suivants: • iss (issuer : Origine du token), • exp (heure d'expiration), • sub (sujet), • aud (public cible), • nbf (Not Before : A ne pas utiliser avant cette date) , • iat ( issued at : date de création du token), • jti ( JWT ID identifiant unique du JWT). { "sub": "Ines" , "iat":49865432, "exp":54789005, "nbf":null, "jti":"idr56543ftu8909876", "roles":["admin","author"] }
3- Signature :
Pour vérifier que l'expéditeur du JWT est celui qu’il prétend être. et pour s'assurer que le message n'a pas été modifié en cours de route.
Si vous voulez utiliser l'algorithme HMAC SHA256, la signature sera créée de la façon suivante : HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
Comment utiliser JWT :
• Au moment d’authentification :
- -
L’utilisateur se connecte avec ses informations d’identification, Un JWT est renvoyé, il est enregistré généralement dans le Storage Local.
• Disposant de ce jeton, le client doit maintenant envoyer une requêtes pour chaque accès à une ressources sécurisée : Il doit envoyer le jeton généralement dans l’en-tête Authorization avec le schéma Bearer: Authorization: Bearer <jeton>
18
Principe :
L’objectif est de et d’autorisation se déroule ainsi :
sécuriser
l’accès aux
services à
travers
les
jetons.
Le processus d’authentification
1-
2- Une
envoyer
commence par
client Le l’authentification. fois authentifié. Le serveur stocke ce jeton généré avec l’identifiant de l’utilisateur et sa date d’expiration.
l’authentification est
son mot de passe
génère un
validée,
serveur
login
son
et
le
au
serveur pour
jeton pour
cet utilisateur
ce
jeton,
et durant requêtes
la au
validité de serveur.
ce dernier, chaque
Pour
client
le requête,
a maintenant doit
client
le
3- 4- Disposant de
le
jeton associé à cette dernière. A ce niveau,
5-
des
d’envoyer
l’autorisation envoyer son jeton. En recevant une requête, le serveur vérifie les détails de l’utilisateur et peut : a. Accepter dans ce cas la requête, si le jeton est valide. b. Refuser la requête, si le jeton n’est pas valide.
le serveur récupère
Atelier Sécuriser un service web RESTFul : (même travail que les autres ateliers + la suite)
1- Ajouter les dépendances 2-
Le projet peut être structuré comme suit :
3- Ajouter la couche de sécurité : implémenter la ressource AuthenticationEndPoint ( class AuthenticationEndPoint) :
pour se connecter - @Path("authentication") : parceque l’utilsateur va se connecter pour la 1ere étape => envoyer cette
ressource à l’utilisateur
19
-
La méthode authenticateUser : elle va envoyer un retour de type Response , elle va consommer deux paramètres (userName et password) , on a utilisé le @FormParam parce que le username et le password doivent être envoyer dans un formulaire ( on peut pas les écrire dans le PathParam : pas de sécurité ) , elle va les récupérer de formulaire , On peut également envoyer ces paramètres sous la forme d’un objet de type Crédentials qu’on définira ainsi:
- -
La méthode authenticate : pour vérifier si le username et le password sont valides ou non Après avoir vérifié que le compte est valide : on va générer le tokon
-
Générer la key qui va signer le token : on va trouver dans ce jwtToken : subject / issuer càd le path qui est déjà lancer la génération de ce token / la date : quand le token est déjà générer / la date d’expiration (seulement 15min : après 15 min le token disparaitre pour la sécurité) / algorithme de cryptage (HS512) => return jwtToken càd après l’étape d’authentification je vais envoyer au client un token unique 4- Comment on a fait la liaison entre la classe AuthenticationEndPoint et la classe gestionEmploye (comment avoir
que la ressource employée sont des ressources sécurisées) : -
Ajouter le package jaxrs.filters : on va à chaque fois filtrer les requêtes ,Dans la classe AuthenticationFilter : récupérer le token , vérifier s’il est valide ou non Je vais sécuriser les ressources en utilisant une annotation non prédéfinie qui on va l’implémenter sous la classe secured.java qui va être utilisée pour des type ou des méthodes (on va ajouter @secured sur la classe GestionEmploye ou/et sur chaque méthode)
-
20
Résumé :
Un web service :
Des fonctionnalités métier accessible via des protocoles standards. Expose un contrat décrivant les modalités d’utilisation de service. Abstrait : un SW est une boite noire Réutilisable
Architecture SOA
contrat
REST - -
JAX-B: Marshalling et Unmardhalling JAX-RS: exposer les services, on a utilisé les annotations
Ch7 : SOAP
Un service web en action :
Afin de mettre en œuvre un service web, trois composants sont nécessaires :
Un langage pour décrire le service web : WSDL (contrat) Un protocole de communication pour écrire les messages échangés entre le consommateur et le fournisseur :
SOAP
Un protocole de transport afin de faire circuler les informations sur Internet (exemple : http)
WSDL : Web Service Description Langage basé sur XML => Langage de description de contrat d’un SW. (Connaitre le type d’input, output, les différents opérations implémentés : leurs entées, leur sortie, leur type, comment y accéder à ces adresses, protocoles utilisés, quel est le format des échanges : les messages(requête/réponse) …)
Structure WSDL :
21
Une description concrète : Définition du protocole d'accès et de l’URI à partir de laquelle on peut accéder au service web
Une description abstraite : nom des opérations, paramètres d'entrée, de sortie, structure des messages
On peut associer la description abstraite avec plusieurs descriptions concrètes => Réutilisabilité de la description
abstraite (avantages de structure à deux parties)
1- Partie abstraite :
Types : Contient la définition des types de données à transmettre, Exprimé en XSD. Exemple :
1ere couche
Messages : contient la description des messages échangés avec le service web Paramètres d’entrée des opérations Paramètres de sortie Pour exécuter une opération
- -
Client
Fournisseur
Opérations : est comparable à une méthode en java : identifiée par un nom / contient 1 ou plusieurs
entrées/sorties
Portype : comparable à une interface en java : identifiée par un nom/ contient un ensemble d’opérations
22
Partie concréte :
Binding : permet de définir pour un portype : - le format des messages échangés(SOAP) – le protocole de transfert (http/FTP/SMTP ...)
On peut associer plusieurs
bindings à un même portype
Deux binding pour un même portype
Protocole de transport des
messages SOAP
URL vers le service
Format des messages
échangés
Port : permet de spécifier une adresse pour un binding donnée
Service : contient une collection de ports
SOAP : Simple Object Access Protocol => un protocole pour la communisation avec un web Service
On va utiliser des messages de type SOAP , le client est hébergé en local et on va consommer un service web qui est hébergé à distance , ils sont pas un service implémenté en local en utilisant le contrat.
Pour communiquer avec un fournisseur il faut envoyer un message de type SOAP ,Dans ce message :
Message SOAP d’une réquette :
23
Exemple (opération Add) :
Est-ce que cette opération est implémenter en local sur ma machine ? non, elle est effectuée dans un autre serveur => ce pour cela qu’on utiliser l’URL pour accéder à cette opération
Corps de messages SOAP pour appeler des opérations du service Web Notebook :
Résultat = true
Résumé :
Les étapes pour implémenter un WS SOAP :
1. Implémenter Service, vous pouvez utiliser le Java, PHP… 2. Préparer le contrat : input, output, types, port, url…. 3. Publier le contrat 4. Découverte 5. Interaction entre le client et le fournisseur
Ch8 : JAX-WS
SW étendus : est un web service (pag