Les premiers pas
Découvrir un nouveau cadre d'application peut être intimidant, surtout sans personne pour vous accompagner dans les phases difficiles. Nous espérons que cette page vous permettra de franchir ces étapes sans difficulté et de développer des services performants.
Installation
Si vous n'avez pas encore installé Halcyon, lisez la page d'Installation.
Démarrer une nouvelle application
Si vous connaissez Rails ou Merb, vous savez que vous pouvez commencer à travailler sur une nouvelle application très facilement en exécutant une commande simple, similaire à rails app_name. Halcyon propose une commande similaire.
Exécutez la commande suivante en ligne de commande (assurez-vous d'être dans un répertoire où vous acceptez la création de votre projet) :
| $ halcyon init app_name |
Cela générera une sortie similaire à la suivante :
|
create create app create app/application.rb create config create config/config.yml create config/init create config/init/environment.rb create config/init/hooks.rb create config/init/requires.rb create config/init/routes.rb create lib create lib/client.rb create Rakefile create README create runner.ru create log |
Cela vous montre quels fichiers ont été créés, mais surtout, ceux avec lesquels vous allez travailler.
Maintenant, accédez au répertoire app_name :
| $ cd app_name |
Vous êtes désormais l'heureux propriétaire d'une toute nouvelle application Halcyon. Il est temps d'exécuter git init pour commencer à suivre votre application sous le contrôle des révisions Git.
Remarque : Avec halcyon init -g, le nouveau répertoire de l'application sera initialisé comme un nouveau dépôt Git. -G validera les fichiers initiaux.
Exécution des applications Halcyon
Alors, avec notre toute nouvelle application, voyons à quoi ressemble l'exécution de notre application :
| halcyon start -p 4647 |
Cela indique à Halcyon de démarrer l'application Halcyon à l'aide de l'utilitaire rackup de Rack ou de l'utilitaire thin start de Thin (si Thin est installé), ainsi que du port sur lequel exécuter le serveur.
Vous verrez le résultat suivant :
|
(Starting in /path/to/app_name) DEBUG [2008-05-27 19:51:39] (9250) AppName :: Init: Requires DEBUG [2008-05-27 19:51:39] (9250) AppName :: Init: Hooks DEBUG [2008-05-27 19:51:39] (9250) AppName :: Init: Routes DEBUG [2008-05-27 19:51:39] (9250) AppName :: Init: Environment DEBUG [2008-05-27 19:51:39] (9250) AppName :: Load: Application Controller INFO [2008-05-27 19:51:39] (9250) AppName :: Starting up... INFO [2008-05-27 19:51:39] (9250) AppName :: Define startup tasks in config/init/hooks.rb DEBUG [2008-05-27 19:51:39] (9250) AppName :: Starting GC. INFO [2008-05-27 19:51:39] (9250) AppName :: Started. PID is 9250 |
Cela vous en dit plus sur son processus de démarrage et vous permet de savoir quand il est prêt à accepter des connexions.
Dans une autre fenêtre d'interpréteur de commande, tout en laissant votre application Halcyon active, exécutez la commande suivante :
|
1 $ irb -r rubygems -r halcyon 2 >> client = Halcyon::Client.new('http://localhost:4647/') 3 => #<Halcyon::Client ...> 4 >> client.get('/time') 5 => {"status"=>200, "body"=>"Tue May 27 19:53:15 -0500 2008"} 6 >> exit |
Après avoir requis la bibliothèque Halcyon, nous créons une instance de Halcyon::Client et lui indiquons où se connecter.
Une fois le client créé, nous pouvons exécuter des requêtes à l'aide des types de requêtes HTTP standard : GET, POST, PUT et DELETE. Il suffit d'appeler get('/time') qui est routé vers l'action temporelle du contrôleur d'application, dans le fichier app_name/app/application.rb.
Ne vous inquiétez pas, vous pourrez intégrer les requêtes get et post dans vos propres méthodes client personnalisées et exécuter les actions correspondantes dans l'application Halcyon.
Modification des contrôleurs de votre application
Contrôleurs
Les contrôleurs d'Halcyon héritent tous de Halcyon::Controller, fournissant plusieurs méthodes utiles pour répondre à différentes situations, comme la méthode ok pour répondre avec la réponse HTTP standard 200 OK, accompagnée des données nécessaires.
Par exemple, un contrôleur pourrait ressembler à ceci :
- class Messages < Application
- def new
- # répondre avec des champs acceptables
- ok Model.columns
- end
- def create
- msg = Message.create(params.merge(:tags => params[:tags].join))
- msg.save
- ok msg.id
- end
- def read
- ok Message[params[:id]]
- end
- def update
- Message.filter(:id => params[:id]).update(params)
- ok
- end
- def delete
- Message.filter(:id => params[:id]).delete
- ok
- end
- end
Message fait référence à un modèle Sequel, nous permettant de communiquer avec la table des messages. Il peut s'agir aussi bien d'un modèle Sequel, d'un modèle ActiveRecord ou d'un modèle DataMapper.
Routes
Une partie du développement d'une application Halcyon consiste à écrire les contrôleurs, mais les requêtes doivent être routées vers les actions appropriées.
Par défaut, aucune route n'est définie pour une application, mais il est possible de définir rapidement des routes correspondant à n'importe quelle variation de /:controller/:action/:id, etc. Voici un exemple, incluant également une route personnalisée :
- ## /path/to/app_name/config/init/routes.rb
- Halcyon::Application.route do |r|
- r.match('/api/:version/:controller/:action(/:id)?').to()
- r.default_routes
- end
Clients
Le moyen le plus simple de communiquer avec votre application Halcyon est d'utiliser un client Halcyon. Par défaut, il permet d'exécuter facilement des requêtes GET, POST, PUT et DELETE sur les routes applicatives, mais peut être étendu avec des méthodes correspondant facilement à vos routes. Par exemple :
- >> class MessageClient < Halcyon::Client
- *> def create(params)
- *> post("/api/1.0/messages/create", params)
- *> end
- *> end
- >> Message = MessageClient.new('http://localhost:4647/')
- => #<MessageClient>
- >> Message.create(:message => 'Premier test.', :tags => ['test', 'first'])
- => {'status' => 200, 'body' => {:id => 1}}
- >> Message.post("/api/1.0/messages/create", :message => 'Deuxième test.', :tags => [])
- => {'status' => 200, 'body' => {:id => 2}}
Vous pouvez également intégrer des clients à vos modèles existants.