Web Service REST sous Grails

 

Introduction
Un WebService est un programme informatique permettant la communication et l'échange des données entre applications et systèmes hétérogènes (Java, C, PHP, …). Il s'agit donc d'un ensemble de fonctionnalités exposées sur internet ou intranet de manière synchrone. Il existe plusieurs modèles architecturals sur lesquelles sont basée les WebService tel que: REST, SOAP, RSS and Atom.

Les WebServices de type REST (Representational state transfer)  
REST n'est pas un protocole ou un format, c'est un style d'architecture, c'est le style architectural original du Web. L'application de cette architecture au Web se comprend sur quelques principes simples :
  • l'URI est important : connaître l'URI doit suffire pour nommer et identifier une ressource.

  HTTP fournit toutes les opérations nécessaires :
    • GET pour la récupération de données.
    • PUT pour créer des données
    • POST pour la mise à jour.
    • DELETE pour supprimer des données
Exemple d'un Web Service REST sous Grails Création d'une application Grails :
Grails> create-app GrailsRest
Cette commande nous permet de créer un projet nommé GrailsRest. Ressource : La ressource que nous allons traiter ici est un simple client avec les attributs firstName , lastName et zipcode. Créer « User.groovy » dans « grails-app/domain »
class User {
     String firstName
     String lastName
     String zipcode
 }
URLMappings: Mise à jour de la class "UrlMappings" qui ce trouve sous « grails-app/conf »
class UrlMappings {

    static mappings = {
        "/user" (controller: "user") {
              action = [GET:"list", POST: "create"]
            }
        "/user/$id" (controller: "user") {
              action = [GET: "show", PUT:"update", DELETE:"delete"]
            }
    }
}
Contrôleur: Créer UserController.groovy dans « grails-app/controller », et nous allons commencer à travailler sur les opérations REST de notre ressource la meme chose pour JSON  
import grails.converters.XML 
class UserController {

//---------------------- Create------------------------------

def create = {
  def xml = request.XML
  def user = new User()
  user.firstName = xml.firstName.text()
  user.lastName = xml.lastName.text()
  user.zipcode = xml.zipcode.text()
  if (user.validate()) {
    user.save();
    response.status = 201
    render user as XML
 } else {
    sendValidationFailedResponse(user, 403)
   }
}
private def sendValidationFailedResponse(user, status) {
response.status = status
render contentType: "application/xml", {
errors {
user?.errors?.fieldErrors?.each {err ->
field(err.field)
message(g.message(error: err))
}
}
}
}
//------------------------ Read-------------------------------
def list = {render User.list() as XML}
def show = {
User user = User.get(params.id)
if (user) {
render user as XML
} else {
SendNotFoundResponse()
}
}
private def SendNotFoundResponse() {
response.status = 404
render contentType: "application/xml", {
errors {
message("User not found with id: " + params.id)
}
}
}
//------------------------ Update-------------------------------
def update = {
User user = User.get(params.id)
if (!user) {
SendNotFoundResponse() }
def xml = request.XML
user.firstName = xml.firstName.text()
user.lastName = xml.lastName.text()
user.zipcode = xml.zipcode.text()
if (user.validate()) {
user.save();
response.status = 201
render ""
} else {
sendValidationFailedResponse(user, 403)
}
}
//------------------------ Delete-------------------------------
def delete = {
User user = User.get(params.id)
if (!user) {
SendNotFoundResponse()
}
user.delete();
response.status = 204
render ""
}
}

Teste: Exécutez la ligne de commande :
Grails> run-app
 
Pour tester notre WebService avec les différentes opérations; on va utiliser un client virtuel : « RESTClient » (installer ce plugin sur firefox https://addons.mozilla.org/fr/firefox/addon/restclient ) PUT GET