scala - Akka-http:接受和内容类型处理

标签 scala akka akka-http

我正在尝试 Akka-http,希望有人能阐明以下问题:

  • 如何根据请求中的 accept: header 创建不同的路由?例如,我想要一个代码路径来处理“json”和一个来处理“xml”请求(如果缺少 header ,则默认为“json”)
  • 如果我不希望推断 contentType,我该如何指定它?例如,在下面的代码中,我尝试通过 compactPrint() 运行 json,但这会将其更改为字符串,因此是“text/plain”。我想覆盖它并告诉客户端它仍然是 json。

  • 我的代码是这样的;
    ...
    path("api") {
              get {
                  complete {
                    getStuff.map[ToResponseMarshallable] {
                      case Right(r) if r.isEmpty => List[String]().toJson.compactPrint
                      case Right(r) => r.toJson.compactPrint
                      case Left(e) => BadRequest -> e
                    }
                  }
              }
            }
    ...
    

    这种情况下的响应是 text/plain,因为 compactPrint 创建了一个字符串。
    非常欢迎批评。 ;)

    最佳答案

    您可以按如下方式定义内容类型,

    complete {
               HttpResponse(entity = HttpEntity(ContentType(MediaTypes.`application/json`), """{"id":"1"}"""))
             }
    

    您可以创建您的自定义指令,
      def handleReq(json: String) = {
        (get & extract(_.request.acceptedMediaRanges)) {
          r =>
            val encoding: MediaRange =
              r.intersect(myEncodings).headOption
                .getOrElse(MediaTypes.`application/json`)
            complete {
              // check conditions here
             // HttpResponse(entity = HttpEntity(encoding.specimen, json)) //
            }
        }
      }
    

    并在路由中使用指令作为
    val route = path("api"){ handleReq(json) }
    

    关于scala - Akka-http:接受和内容类型处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32187858/

    相关文章:

    scala - Akka 在不访问流的情况下组合汇

    java - 负载下嵌入式 Jetty 超时

    scala - Akka 流保持空闲状态而不是抛出异常

    scala - 在scala中,如何为不同长度的参数列表生成样板代码?

    scala - 从发布中排除 sbt 多项目中的项目 (sbt-gpg)

    file - 在 Scala 中查找与通配符字符串匹配的文件

    java - 在Gradle的Java测试中使用Scala类

    java - 使用 Maven 分发 akka 微内核应用程序

    scala - Akka http:Akka流与 Actor 建立休息服务

    scala - akka-http 发送连续分块的 http 响应(流)