当前位置: 首页 > 知识库问答 >
问题:

akka http使用Json支持和xmlsupport

徐昊焜
2023-03-14

我们能同时使用spray-json支持https://doc.akka.io/docs/akka-http/current/common/json-support.html和XML支持https://doc.akka.io/docs/akka-http/current/common/xml-support.html吗

 private[rest] def route =
  (pathPrefix("employee") & get) {
    path(Segment) { id =>
      parameters('department ? "") { (flag) =>
        extractUri { uri =>
          complete {
            flag match {
              case "hr": =>  {

            HttpEntity(MediaTypes.`application/xml`.withCharset(HttpCharsets.`UTF-8`),"hr department")
            }
              case "tech" =>{
                HttpEntity(ContentType(MediaTypes.`application/json`), mapper.writeValueAsString("tech department"))

              }

            }
          }
        }
      }
    }
  }

我尝试了以下方法,通过使用JsonProtocols和ScalaXmlSupport,我得到了预期的ResponseMarshallable的编译错误,但找到了Department

case class department(name:String)
private[rest] def route =
  (pathPrefix("employee") & get) {
    path(Segment) { id =>
      parameters('department ? "") { (flag) =>
        extractUri { uri =>
          complete {
            flag match {
              case "hr": =>  {

            complete(department(name =flag))
            }
              case "tech" =>{
                complete(department(name =flag))

              }

            }
          }
        }
      }
    }
  }

共有1个答案

邹丰羽
2023-03-14

我认为有几个问题你必须克服以达到你想要的:

>

  • 您希望根据请求参数自定义响应类型。这意味着基于标准隐式的封送处理对您不起作用,您必须执行一些显式步骤

    您希望将一些业务对象封送到XML字符串中。不幸的是,您引用的scalaxmlsupport不支持这一点,它只能将XML树封送到响应中。所以您需要一些可以执行XML序列化的库。一个选择是将jackson-dataformat-xml与jackson-module-scala一起使用。这还意味着您必须编写自己的自定义封送器。幸运的是没有那么难。

    import akka.http.scaladsl.marshalling.{ToResponseMarshallable, Marshaller}
    
    // json marshalling
    import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport
    import spray.json._
    import spray.json.DefaultJsonProtocol._
    implicit val departmentFormat = DefaultJsonProtocol.jsonFormat1(department)
    val departmentJsonMarshaller = SprayJsonSupport.sprayJsonMarshaller[department]
    
    // xml marshalling, need to write a custom Marshaller
    // there are several MediaTypes for XML such as `application/xml` and `text/xml`, you'll have to choose the one you need.
    val departmentXmlMarshaller = Marshaller.StringMarshaller.wrap(MediaTypes.`application/xml`)((d: department) => {
      import com.fasterxml.jackson.dataformat.xml.XmlMapper
      import com.fasterxml.jackson.module.scala.DefaultScalaModule
      val mapper = new XmlMapper()
      mapper.registerModule(DefaultScalaModule)
      mapper.writeValueAsString(d)
    })
    
    
    private val route =
      (pathPrefix("employee") & get) {
        path(Segment) { id =>
          parameters('department ? "") { (flag) =>
            extractUri { uri => {
              flag match {
                case "hr" => {
                  // explicitly use the XML marshaller 
                  complete(ToResponseMarshallable(department(name = flag))(departmentXmlMarshaller))
                }
                case "tech" => {
                  // explicitly use the JSON marshaller 
                  complete(ToResponseMarshallable(department(name = flag))(departmentJsonMarshaller))
                }
              }
            }
            }
          }
        }
      }
    

  •  类似资料:
    • 问题内容: 我有一个对象,希望在JSON中作为RESTful资源使用。我已经启用了Jersey的JSON POJO支持(在web.xml中): 但是,当我尝试访问资源时,出现以下异常: 我要提供的类并不复杂,它只有一些公共final字段和一个设置所有这些的构造函数。字段是所有字符串,基元,与此类似的类或它们的列表(我尝试使用普通列表而不是通用List ,但无济于事)。有谁知道给什么?谢谢! Jav

    • Go内置了对JSON数据的编码和解码,这些数据的类型包括内置数据类型和自定义数据类型。 package main import "encoding/json" import "fmt" import "os" // 我们使用两个结构体来演示自定义数据类型的JSON数据编码和解码。 type Response1 struct { Page int Fruits []string

    • 我有一个restful web服务,支持HATEOAS链接。当我打电话时“http://localhost:8080/v1/bookings/1225380?lock=true“链接我得到了以下资源URL。我想将这些超媒体与我的Angular2应用程序(最近升级到最终版本)集成。我发现很少有资源是在Angular1支持下实现的(链接-https://paulcwarren.wordpress.co

    • 我试图在XAMP中创建一个json数据库,在使用phpmyAdmin时,它显示我正在使用mariaDB,但在我的它显示在端口3306上运行。我正在使用Laravel 5.4 framework创建数据库,下面是我尝试执行的迁移: 现在,在执行此操作时,我遇到以下错误: SQLSTATE[42000]:语法错误或访问冲突: 1064你有一个错误在您的SQL语法;检查手册,对应于您的MariaDB服务

    • 我对Android Studio3.0金丝雀有一个问题。在所有项目中,我不能使用预览工具中的支持库中的任何视图。显示呈现错误。在新项目中也是同样的问题。 Samople代码: 格雷德尔:

    • 社区帮助 社区帮助是 adobe.com/cn 上的一个集成环境,允许您访问由 Adobe 和行业专家主持的社区生成的内容。用户的注释可帮助您找到答案。搜索 “社区帮助 ”,查找 Web 上关于 Adobe 产品和技术的最佳内容,包含以下资源: 视频、教程、提示和技巧、博客、文章及设计和开发人员的示例。 完整的联机帮助。此联机帮助会定期更新且比随产品提供的 “帮助 ”更完整。访问帮助时,如果连接到