Une API JSON avec Sinatra

Vous avez pu le constater en parcourant ce blog, Sinatra est l'un de mes frameworks Ruby préférés, à la fois simple d'approche mais malgré tout puissant et adaptable à de nombreux cas d'utilisation. Je trouve notamment que c'est un outil particulièrement adapté à la réalisation d'une API JSON qui sera ensuite consommée par un framework front-end de type Angular JS, Backbone, Ember, et consorts (ou une appli mobile, ou quoi que ce soit qui puisse venir lire et interagir avec une API).


Avant : avec la gem 'json'

Lorsque j'ai été confronté à ce problème pour la première fois, mon moteur de recherche préféré m'a rapidement conduit vers l'article suivant de Nathan Hoad : "How to: return JSON from Sinatra". Depuis, j'ai régulièrement utilisé la méthode suggérée, qui a pour avantage d'être très simple et de très bien fonctionner :

1
2
3
4
5
6
require 'json'

get '/api/route.json' do
  content_type :json
  { key_1: 'value 1', key_2: 'value_2' }.to_json
end

Comme le dit Nathan, "it's that simple !".

Aujourd'hui : avec Sinatra::Contrib

Mais ça, c'était avant ! Cet après-midi, en refaisant quelques recherches sur le sujet, je suis en effet tombé sur une autre façon de faire que je ne connaissais pas et dont je n'avais encore jamais eu connaissance (ce qui est d'autant plus surprenant que la solution en question fait partie de Sinatra::Contrib, dépôt officiel qui regroupe des extensions souvent indispensables à Sinatra). C'est encore plus simple que la 1ère méthode évoquée (oui, c'est possible) :

1
2
3
4
5
require 'sinatra/json'

get '/api/route.json' do
  json key_1: 'value 1', key_2: 'value_2'
end

"It's even more simple !" Principal avantage: une syntaxe plus légère, et plus de risque d'oublier un to_json par-ci, un content_type par-là. Le content_type est automatiquement défini, et to_json est la méthode utilisée par défaut pour sérialiser l'objet que vous souhaitez renvoyer (à noter qu'il est possible de définir un autre content_type ou d'autres sérializers si vous le souhaitez, voir la documentation du module).

Si vous créez une API, vous aurez sans doute à un moment ou un autre besoin de renvoyer un autre code HTTP que 200. Et dans ce cas, comment faire ? Encore une fois, c'est très simple avec Sinatra et sa méthode halt :

1
2
3
get '/api/route.json' do
  halt 401, json( key: 'value' )
end

Et voilà, avec ça vous êtes prêt à implémenter une API JSON tout simplement avec Sinatra !


Référence :