Comment exposer des données au format JSON via un service Web utilisant Rails ?
-
09-06-2019 - |
Question
Existe-t-il un moyen simple de renvoyer des données aux clients de services Web en JSON à l'aide de Rails ?
La solution
La ressource Rails offre une interface RESTful pour votre modèle.Voyons.
Modèle
class Contact < ActiveRecord::Base
...
end
Itinéraires
map.resources :contacts
Manette
class ContactsController < ApplicationController
...
def show
@contact = Contact.find(params[:id]
respond_to do |format|
format.html
format.xml {render :xml => @contact}
format.js {render :json => @contact.json}
end
end
...
end
Cela vous donne donc une interface API sans avoir besoin de définir des méthodes spéciales pour obtenir le type de réponse requis
Par exemple.
/contacts/1 # Responds with regular html page
/contacts/1.xml # Responds with xml output of Contact.find(1) and its attributes
/contacts/1.js # Responds with json output of Contact.find(1) and its attributes
Autres conseils
Rails Monkeypatche la plupart des choses qui vous intéressent pour avoir un #to_json
méthode.
De mémoire, vous pouvez le faire pour les hachages, les tableaux et les objets ActiveRecord, ce qui devrait couvrir environ 95 % des cas d'utilisation que vous pourriez souhaiter.Si vous avez vos propres objets personnalisés, il est trivial d'écrire les vôtres to_json
méthode pour eux, qui peut simplement bloquer les données dans un hachage, puis renvoyer le hachage jsonisé.
Il existe un plugin qui fait exactement cela,http://blog.labnotes.org/2007/12/11/json_request-handling-json-request-in-rails-20/
Et d'après ce que j'ai compris, cette fonctionnalité est déjà dans Rails.Mais allez voir cet article de blog, il y a des exemples de code et des explications.
ActiveRecord fournit également des méthodes pour interagir avec JSON.Pour créer JSON à partir d'un objet AR, appelez simplement object.to_json.POUR créer un objet AR à partir de JSON, vous devriez pouvoir créer un nouvel objet AR, puis appeler object.from_json.autant que j'ai compris, mais cela n'a pas fonctionné pour moi.