如何在喷雾中执行简单的 json post with spray-json?

How to perform a simple json post with spray-json in spray?

我正在尝试使用喷雾执行简单的 json post。但似乎我可以获得一个可以是 Marshall 的 json 对象的 http 实体。

这是我的错误:

[error] ...../IdeaProjects/PoolpartyConnector/src/main/scala/org/iadb/poolpartyconnector/thesaurusoperation/ThesaurusCacheService.scala:172: could not find implicit value for evidence parameter of type spray.httpx.marshalling.Marshaller[spray.json.JsValue]

[error] val request = Post(s"$thesaurusapiEndpoint/$coreProjectId/suggestFreeConcept?", suggestionJsonBody)

及其附带的代码:

 override def createSuggestedFreeConcept(suggestedPrefLabel: String, lang: String, scheme: String, b: Boolean): String = {

    import system.dispatcher
    import spray.json._

    val pipeline      = addCredentials(BasicHttpCredentials("superadmin", "poolparty")) ~> sendReceive


    val label              = LanguageLiteral(suggestedPrefLabel, lang)
    val suggestion         = SuggestFreeConcept(List(label), b, Some(List(scheme)), None, None,None, None)
    val suggestionJsonBody = suggestion.toJson

    val request            = Post(s"$thesaurusapiEndpoint/$coreProjectId/suggestFreeConcept?", suggestionJsonBody)

    val res                = pipeline(request)

    getSuggestedFromFutureHttpResponse(res) match {

      case None => ""
      case Some(e) => e

    }
  }

拜托,有没有人知道隐式编组器发生了什么。我虽然喷雾 Json 会带有隐式编组器。

我假设您已经在某处有自定义 Json 协议,以便 suggestion.toJson 正常工作?

尝试以下操作:

val body = HttpEntity(`application/json`, suggestionJsonBody.prettyPrint)
val request = Post(s"$thesaurusapiEndpoint/$coreProjectId/suggestFreeConcept?", body)

您也可以使用 compactPrint 而不是 prettyPrint,在任何一种情况下,它都会将 Json 转换为包含 json 信息的字符串。

我是这样解决的:

override def createSuggestedFreeConcepts(suggestedPrefLabels: List[LanguageLiteral], scheme: String, checkDuplicates: Boolean): List[String] = {


    import system.dispatcher

    import spray.httpx.marshalling._
    import spray.httpx.SprayJsonSupport._

    val pipeline      = addCredentials(BasicHttpCredentials("superadmin", "poolparty")) ~> sendReceive


    suggestedPrefLabels map { suggestedPrefLabel =>

      val suggestion    = SuggestFreeConcept(List(suggestedPrefLabel), checkDuplicates, Some(List(Uri(scheme))), None, None, None, None)
      val request       = Post(s"$thesaurusapiEndpoint/$coreProjectId/suggestFreeConcept", marshal(suggestion))

      val res           = pipeline(request)

      getSuggestedFromFutureHttpResponse(res) match {

        case None => ""
        case Some(e) => e

      }

    }

  }

关键是:

import spray.httpx.marshalling._ import spray.httpx.SprayJsonSupport._

val request = Post(s"$thesaurusapiEndpoint/$coreProjectId/suggestFreeConcept", marshal(suggestion))

我整理了建议。解释不是超级简单。但是通过在文档中查找,它得到了解释。