Ratpacked: Respond To Custom MIME Types
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. 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.
Join the DZone community and get the full member experience.
Join For FreeIn 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.
Published at DZone with permission of Hubert Klein Ikkink, DZone MVB. See the original article here.
Opinions expressed by DZone contributors are their own.
Comments