Как выполнить простой json-пост с помощью spray-json в спрее?

Я пытаюсь выполнить простой json-пост с помощью спрея. Но кажется, что я могу получить объект http для объекта json, которым может быть Маршалл.

вот моя ошибка:

[ошибка] ..... / IdeaProjects / PoolpartyConnector / src / main / scala / org / iadb / poolpartyconnector / thesaurusoperation / ThesaurusCacheService.scala: 172: не удалось найти неявное значение для параметра свидетельства типа spray.httpx.marshalling.Marshaller [spray.json.JsValue]

[ошибка] val request = Post (s "$ thesaurusapiEndpoint / $ coreProjectId / offerFreeConcept?", offerJsonBody)

и код, который к нему прилагается:

 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 будет поставляться с неявным маршаллером.


person MaatDeamon    schedule 03.08.2015    source источник


Ответы (2)


Я предполагаю, что у вас уже есть где-то собственный протокол Json, чтобы suggestion.toJson работал правильно?

Попробуйте следующее:

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

вы также можете использовать compactPrint вместо prettyPrint, в любом случае он превращает Json в строку, содержащую информацию json.

person mattinbits    schedule 10.08.2015

Вот как я это решил:

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 / offerFreeConcept", маршал (предложение))

Я делаю предложение. Объяснение не очень простое. Но в документации это объясняется.

person MaatDeamon    schedule 11.08.2015