2012-03-11 1 views

Répondre

1

Comme la documentation que vous faites référence mentionne,

Rails détermine le format de réponse souhaitée de la HTTP Accept tête soumis par le client.

Votre code aussi, peut regarder l'en-tête Accept et décider quoi envoyer en fonction de son contenu, que vous pouvez obtenir par l'indexation dans l'objet de la demande. La question intéressante est de savoir s'il existe un moyen facile d'analyser l'en-tête et de le démonter. Vous pouvez trouver des informations à ce sujet dans les réponses à Is there some Java library for Accept HTTP header parsing?.

+0

La question concernait spécifiquement Compojure/Ring – Sathish

+0

@Sathish Vous pouvez obtenir l'en-tête 'Accept' en faisant' (get-in request [: headers "accept"]) 'où' request' est l'objet de requête transmis à votre gestionnaire. C'est ce que je voulais dire par "indexer dans l'objet de requête". –

2

Vous devez utiliser un intergiciel Ring pouvant gérer le type MIME d'en-tête d'acceptation et convertir la valeur de données de carte de réponse en MIME approprié.

Départ: ring-middleware-format

5

En supposant que vous ne voulez distinguer explicitement sur Accepter tête - et ne pas revenir simplement le type de réponse appropriée selon les réponses de Ankur, vous pouvez créer votre propre fonction d'envoi comme suit.

(defn dispatch [m] 
    (let [req  (ring-request) 
     accept (get (:headers req) "accept") 
     accept? #(re-find (re-pattern (str "^" %)) accept) 
     key  (cond 
       (accept? "application/json") :json 
       (accept? "text/html")  :html 
       :else      :default)] 
    ((key m)))) 

et ensuite appeler comme si

(defpage "/foo" [] 
    (dispatch {:json (fn [] "{}") 
      :html (fn [] "html") 
      :default (fn [] "default")})) 

La fonction accept? ci-dessus est un peu primitive, mais il peut servir de point de départ.

+0

D'où vient la macro 'defpage'? Est-ce une partie de Compojure ou Ring. J'ai trouvé quelques traces à Noir seulement. –

Questions connexes