In Ratpack we can use the byContent
method on the Context
object to send different responses based on the requested MIME type from the client. There is already support for application/json
, application/xml
, text/plain
and text/html
MIME types with corresponding methods of the ByContentSpec
object that is passed as argument to the byContent
method. We can match on a custom MIME type with the method type
and specify the MIME type. If the type matches we can create a response.
In the following example application we have a custom renderer for a User
object:
// File: src/main/groovy/com/mrhaki/ratpack/UserRenderer.groovy package com.mrhaki.ratpack import ratpack.handling.ByContentSpec import ratpack.handling.Context import ratpack.jackson.Jackson import ratpack.render.RendererSupport import static ratpack.groovy.Groovy.markupBuilder class UserRenderer extends RendererSupport<User> { @Override void render(Context context, User user) throws Exception { context.byContent { ByContentSpec spec -> spec .type('application/vnd.com.mrhaki.user+json;v=1') { context.render(Jackson.json(user)) } .type('application/vnd.com.mrhaki.user+xml;v=1') { context.render(markupBuilder('application/xml', 'UTF-8') { delegate.user { username(user.username) } }) } } } }
Next we use it in our Ratpack definition:
import com.mrhaki.ratpack.User import com.mrhaki.ratpack.UserRenderer import static ratpack.groovy.Groovy.ratpack ratpack { bindings { // Register renderer for User objects. bind(UserRenderer) // Create two sample users. bindInstance(['mrhaki', 'hubert'].collect { String name -> new User(username: name) }) } handlers { get('user/:username') { List<User> users -> // Get value for username token. final String username = pathTokens.username // Find user in list of users. final User user = users.find { User user -> user.username == username } // Render user object. render(user) } } }
When we make a request with different accept MIME types we see different results:
$ http localhost:5050/user/mrhaki Accept:application/vnd.com.mrhaki.user+xml;v=1 HTTP/1.1 200 OK connection: keep-alive content-encoding: gzip content-type: application/xml transfer-encoding: chunked <user> <username>mrhaki</username> </user> $ http localhost:5050/user/mrhaki Accept:application/vnd.com.mrhaki.user+json;v=1 HTTP/1.1 200 OK connection: keep-alive content-encoding: gzip content-type: application/vnd.com.mrhaki.user+json;v=1 transfer-encoding: chunked { "username": "mrhaki" } $
Written with Ratpack 1.1.1.