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

如何将akka http请求实体解组为字符串?

云镜
2023-03-14

我正试图将请求有效载荷解组为字符串,但由于某种原因它失败了。我的代码:

path("mypath") {

  post {
    decodeRequest {
      entity(as[String]) {jsonStr => //could not find implicit value for...FromRequestUnmarshaller[String]
        complete {
          val json: JsObject = Json.parse(jsonStr).as[JsObject]
          val jsObjectFuture: Future[JsObject] = MyDatabase.addListItem(json)
          jsObjectFuture.map(_.as[String])
        }
      }          
    }
  }
}

例如,在这个SO线程中,默认情况下似乎应该使用这个隐式。但也许这在Akka-HTTP中是不同的?

我尝试导入akka.http.scaladsl.unmarshalling.predefinedfromentityunmarshallers,它有一个StringUnmarshaller,但没有帮助。可能是因为它返回类型fromentityunmarshaller[String]而不是fromrequestunmarshaller[String]。在spray.httpx.unmarshalling.basicunmarshallers中也有一个字符串解封器,但这也没有帮助,akka.http.scaladsl.unmarshalling.predefinedfromstringunmarshallers

我怎样才能解马修(和马修)成一个字符串?

使用1.0-RC3

多谢了。

共有1个答案

袁博
2023-03-14

只要在作用域中有正确的含义,您的代码就应该是正常的。如果在作用域中有一个隐式flowMaterializer,那么事情应该按照预期工作,正如编译的代码所示:

import akka.http.scaladsl.server.Route
import akka.actor.ActorSystem
import akka.stream.ActorFlowMaterializer
import akka.http.scaladsl.model.StatusCodes._
import akka.http.scaladsl.server.Directives._
import akka.stream.FlowMaterializer

implicit val system = ActorSystem("test")
implicit val mater = ActorFlowMaterializer()

val routes:Route = {
  post{
    decodeRequest{
      entity(as[String]){ str =>
        complete(OK, str) 
      }
    }
  }    
}

如果您希望更进一步,将其解组为JSObject,则只需要在作用域中使用一个隐式Unmarshaller来处理转换,如下所示:

implicit val system = ActorSystem("test")
implicit val mater = ActorFlowMaterializer()

import akka.http.scaladsl.unmarshalling.Unmarshaller
import akka.http.scaladsl.model.HttpEntity

implicit val um:Unmarshaller[HttpEntity, JsObject] = {
  Unmarshaller.byteStringUnmarshaller.mapWithCharset { (data, charset) =>
    Json.parse(data.toArray).as[JsObject]
  }    
}  

val routes:Route = {
  post{
    decodeRequest{
      entity(as[String]){ str =>
        complete(OK, str) 
      }
    }
  } ~
  (post & path("/foo/baz") & entity(as[JsObject])){ baz =>
    complete(OK, baz.toString)
  }    
}
 类似资料:
  • 问题内容: 我想设计一个具有String []属性的实体类。这个String Array总是有两个值,我不希望Hibernate(或JPA)为此创建一个额外的表,而是直接将这两个String值嵌入到表中。这有可能吗? 问题答案: 如果总是存在两个值,则可以使用getter / setter和instance变量。您确实可以选择使用映射实例变量还是属性。 否则请看实体。精神上的东西

  • 我想知道如何将这个字符串转换为数组: 我已经在这里找到了这个: 但如果我试图使对象为空,我总是得到空值。这里: 我不知道我应该输入什么作为“位置”。我应该输入“[]”吗? 非常感谢您的帮助! 丹尼尔

  • 问题内容: 我试图解析一个字符串,以分隔字符串中的列表。我目前有字符串: 有什么方法可以解析字符串,以便字典键是列表的第一个元素,而键的值是元素的下一个。例如: 问题答案: insted的的,你可以有列表: 您可以使用从字符串解析Python数据结构

  • 问题内容: 我有这个字符串:10,692,467,440,017.120(是一个数字)。 我想将其解析为BigDecimal。问题是我没有尝试过DecimalFormat和NumbeFormat。有什么帮助吗? 问题答案: 试试这个 如果要构建具有I18N支持的应用程序,则应使用 还请记住,它可能会引发a,因此您需要处理它(使用try / catch)或引发它,然后让程序的另一部分处理它

  • 问题内容: 我有一个弦 然后,我想将其解析为sqlDate。并将其插入数据库。 是否可以将该字符串解析为sqlDate?!?! 是的,SQL日期格式为“ yyyy-mm-dd” 问题答案: 用于将String日期解析为java.util.Date 然后使用millis将其转换为java.sql.Date

  • 问题内容: 我试图在网上四处寻找将字符串拆分为字符数组的答案,但似乎找不到一个简单的方法 似乎不像Ruby那样工作。有没有一种简单的方法可以不循环? 问题答案: