Ring middleware that augments :params according to the specified Accept request-header field. Helps to indicate which type is acceptable for the response, for example text/html, text/xml or application/json. When no format can be deduced, a default value is set (text/html).
Usage
Augments :params with an entry identified by the key :accept and the detected value. You can now render the response in your routes given the desired format, a la Grails.
Artifact
With Leiningen:
[ring-accept-param "0.1.1"]
With Maven:
<dependency>
<groupId>ring-accept-param</groupId>
<artifactId>ring-accept-param</artifactId>
<version>0.1.1</version>
</dependency>
Configuration
To configure and use this middleware:
(ns my-app.handler (:use [compojure.core :only [defroutes GET]] [ring.middleware.accept-param :only [wrap-accept-param]] [cheshire.core :only [generate-string]]) (:require [compojure.handler :as handler] [compojure.route :as route])) (defn do-json-hello [] {:status 200 :headers {"Content-Type" "application/json; charset=utf-8"} :body (generate-string {:response "Hello World"})}) (defroutes app-routes (GET "/" {params :params} (do (println params) (case (:accept params) "json" (do-json-hello) "html" "Hello World"))) (route/not-found "Not Found")) (def app (-> app-routes wrap-accept-param (handler/site)))
You can test this with curl:
$ curl -i http://127.0.01:3000
HTTP/1.1 200 OK
Date: Wed, 22 Aug 2012 20:49:14 GMT
Content-Type: text/html;charset=UTF-8
Content-Length: 11
Server: Jetty(7.6.1.v20120215)
Hello World
And with a specified Accept: application/json header:
$ curl -i http://127.0.01:3000 -H "Accept: application/json"
HTTP/1.1 200 OK
Date: Wed, 22 Aug 2012 20:49:18 GMT
Content-Type: application/json;charset=utf-8
Content-Length: 26
Server: Jetty(7.6.1.v20120215)
{"response":"Hello World"}
Roadmap
Bunch of planned features:
- Add more types like plain text or YAML.
- Consider vendor-specific types in a non-strict mode.
- Allow middleware configuration (default type, strict mode, etc.).
- Implement Accept request-header field specs.
See also
You can also try:
License
Copyright (C) 2012 Gaylord Mazelier
Distributed under the Eclipse Public License, the same as Clojure.