scalascalatra

How do I make the default response Content-type: application/json with Scalatra


I'm learning Scalatra and am wondering how I can make the default Content-Type of my responses application/json. The current default appears to be text/html. Neat, but not really useful to my application.

The current default is text/html.

$ curl -i -X GET 'http://localhost:8080/v1/example'
HTTP/1.1 200 OK
Date: Fri, 19 Apr 2019 07:21:21 GMT
Content-Type: text/html;charset=utf-8
Content-Length: 23
Server: Jetty(9.4.8.v20171121)

HelloWorld(hello,world)

I can get application-json explicitly through the Accepted: application/json header.

$ curl -i -X GET 'http://localhost:8080/v1/example' -H 'Accept: application/json'
HTTP/1.1 200 OK
Date: Fri, 19 Apr 2019 07:22:09 GMT
Content-Type: application/json;charset=utf-8
Transfer-Encoding: chunked
Server: Jetty(9.4.8.v20171121)

{"hello":"hello","world":"world"}

How do I set the default to be application/json.


Solution

  • defaultFormat could be overridden to make application/json the default case. For example,

    import java.io.File
    import org.scalatra._
    import org.scalatra.util.MimeTypes
    import org.json4s.{DefaultFormats, Formats}
    import org.scalatra.json._
    
    case class HelloWorld(hello: String, world: String)
    
    class MyScalatraServlet extends ScalatraServlet with JacksonJsonSupport {
      protected implicit lazy val jsonFormats: Formats = DefaultFormats
    
      override def defaultFormat: Symbol = 'json
    
      get("/v1/example") {
        HelloWorld("hello", "world")
      }
    
    }
    

    without specifying Accept header should respond with

    curl -i -X GET 'http://localhost:8080/v1/example'
    HTTP/1.1 200 OK
    Date: Thu, 25 Apr 2019 22:28:37 GMT
    Content-Type: application/json;charset=utf-8
    Content-Length: 33
    Server: Jetty(9.4.8.v20171121)
    
    {"hello":"hello","world":"world"}
    

    whilst explicitly requesting Accept: text/html also works

    curl -i -X GET 'http://localhost:8080/v1/example' -H 'Accept: text/html'
    HTTP/1.1 200 OK
    Date: Fri, 26 Apr 2019 15:45:22 GMT
    Content-Type: text/html;charset=utf-8
    Content-Length: 23
    Server: Jetty(9.4.8.v20171121)
    
    HelloWorld(hello,world)