【问题标题】:How do I make the default response Content-type: application/json with Scalatra如何使用 Scalatra 进行默认响应 Content-type: application/json
【发布时间】:2019-04-19 07:31:43
【问题描述】:

我正在学习 Scalatra,我想知道如何将我的回复 application/json 设为默认的 Content-Type。当前默认值似乎是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

【问题讨论】:

  • 如何生成响应?只需返回一个包含 json 的字符串?如果您要使用正确的类型,那么它 scalatra 应该能够确定内容类型,如下所示:github.com/swagger-api/scalatra-sample-app/blob/master/src/main/…
  • @michaJlS Scalatra 足够聪明,知道如何处理案例类。如果客户端请求-H Accept: application/json scalatra 已经在这样做,那么 scalatra 将采用 case 类并制作 JSON 字符串。这很好用。问题是,我希望默认为Content-Type: application/json。 Scalatra 并没有那么方便。必须有办法。
  • 所以这个链接应该会有帮助:scalatra.org/guides/2.3/formats/json.html
  • @michaJlS 谢谢,但我已经过去了。 before() { contentType = formats("json") } 确实将 Servlet 的 contentType 设置为常量 application/json,因此如果有人请求 text/html,他们不会得到它。我要做的就是在没有Accepts 标头的情况下覆盖默认值。令人惊讶的是,要做到这一点是如此困难。

标签: scala scalatra


【解决方案1】:

defaultFormat 可以被覆盖以使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)

【讨论】:

  • @"Mario Galic"。很酷,但是....晦涩难懂?我有点期待更多类似override def defaultFormat = formats("json") 的东西。你是怎么想出来的?我对 Scala 很陌生,对 Scalatra 完全陌生,我正在努力在这个“生态系统”中找到自己的方式。
  • 我在 Scalatra Github 存储库中搜索了术语 Accept 以查看标题是如何使用的,这导致我找到了 ApiFormats.scala
猜你喜欢
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-27
  • 2014-10-06
  • 2012-01-30
  • 1970-01-01
  • 2020-10-05
相关资源
最近更新 更多