如何使用Scalatra创建默认响应内容类型:application/json

如何使用Scalatra创建默认响应内容类型:application/json,scala,scalatra,Scala,Scalatra,我正在学习Scalatra,我想知道如何才能使我的响应的默认内容类型application/json。当前默认设置为text/html。整洁,但对我的应用程序不是很有用 当前默认值为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

我正在学习Scalatra,我想知道如何才能使我的响应的默认内容类型
application/json
。当前默认设置为
text/html
。整洁,但对我的应用程序不是很有用

当前默认值为
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)
我可以通过
Accepted:application/json
头显式获取
application-json

$ 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"}
如何将默认设置为
application/json

可以覆盖
application/json
作为默认情况。比如说,

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")
  }

}
如果不指定
Accept
标题应以

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"}
在明确请求
Accept:text/html
的同时也可以工作

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)

您如何生成响应?只需返回包含json的字符串?如果您想使用正确的类型,那么it scalatra应该能够像这里一样确定内容类型:@michaJlS scalatra足够聪明,知道如何处理案例类。如果客户端请求
-H Accept:application/json
scalatra获取case类并生成json字符串,那么它已经在这样做了。这很有效。问题是,我希望默认值仅为
内容类型:application/json
。Scalatra并没有让这变得如此方便。一定有办法的。所以这个链接应该会有帮助:@michaJlS谢谢,但我已经远远超过了。before(){contentType=formats(“json”)}确实将Servlet的contentType设置为常量
application/json
,因此如果有人请求
text/html
,他们不会得到它。我所要做的就是在没有
Accepts
头的情况下覆盖默认值。令人惊讶的是,要做到这一点是如此困难。很酷,但是…晦涩难懂?我有点期待更多类似于
override def defaultFormat=formats(“json”)
之类的东西。你怎么知道的?我对Scala是新手,对Scalatra也是完全陌生的,我试图在这个“生态系统”中找到自己的路。我在Scalatra Github repo中搜索了术语
Accept
,以查看标题是如何被使用的,这让我找到了
ApiFormats.Scala