Отправка сообщения с помощью json с помощью спрея?

Извините, у меня не получается это сделать: мне нужно добавить json в сообщение, поэтому следуйте документации: http://spray.io/documentation/1.1-M8/spray-httpx/request-building/ :

import scala.util.{Success, Failure}
import akka.actor.{Props, ActorSystem}
import spray.can.client.DefaultHttpClient
import spray.client.HttpConduit
import spray.httpx.SprayJsonSupport
import spray.http._
import spray.json.JsonParser._
import spray.json._
import HttpMethods._
import HttpHeaders._
import MediaTypes._
import spray.httpx.RequestBuilding._
import scala.concurrent.ExecutionContext.Implicits.global

...

val req = HttpRequest(method = POST, uri = "/api/1.0/users/ping.json", entity = HttpEntity(`application/json`,"""{ "key"="whatever" }"""))

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

overloaded method value apply with alternatives:
[error]   (optionalBody: Option[spray.http.HttpBody])spray.http.HttpEntity <and>
[error]   (buffer: Array[Byte])spray.http.HttpEntity <and>
[error]   (string: String)spray.http.HttpEntity
[error]  cannot be applied to (spray.http.MediaType, String)
[error]     val req = HttpRequest(method = POST, uri = "/api/1.0/users/ping.json", entity = HttpEntity(`application/json`,"""{ "key"="whatever"}"""))

person dzs    schedule 04.09.2013    source источник


Ответы (3)


Была такая же проблема и нашел решение здесь:

https://github.com/spray/spray-json/blob/master/src/main/scala/spray/json/AdditionalFormats.scala#L30-41

Это, наконец, сработало для меня:

import spray.httpx.SprayJsonSupport
import spray.json.AdditionalFormats

object Client extends SprayJsonSupport with AdditionalFormats {
    val email = "..."
    val password = "..."
    val pipeline = sendReceive       
    pipeline(Post("http://something.com/login", s"""{
        "email": "$email",
        "password": "$password"
    }""".asJson.asJsObject))
}
person lost    schedule 11.12.2013

Извините, но ваш вопрос немного громоздкий, по крайней мере для меня. Если вы хотите сделать POST-запрос в Spray с некоторым Json как HttpEntity, вам следует попробовать сделать это с помощью конвейерной обработки Spray-Clients, это очень просто.

Вам нужно создать простой канал:

val pipe: HttpRequest => Future[HttpResponse] = sendReceive

а затем создайте запрос:

import spray.json.SprayJsonSupport._
pipe(Post("/api/1.0/users/ping", """{ "key"="whatever" }""".asJson))

Это вернет вам Future с HttpResponse, если вам нужен какой-то конкретный результат, скажем, например, какой-то код подтверждения, то добавьте шаг unmarshall в свой канал:

val pipe: HttpRequest => Future[ConfCode] = sendReceive ~> unmarshal[ConfCode]
person 4lex1v    schedule 04.09.2013

Это то, что я тоже пробовал, но это не работает, это говорит мне, что мне не хватает неявного:

val pipeline = sendReceive(conduit)
val responseF = pipeline(Post("/api/1.0/users/ping.json", """{ "key": "whatever" }""".asJson))

responseF onComplete { ...

но я всегда получаю:

could not find implicit value for evidence parameter of type spray.httpx.marshalling.Marshaller[spray.json.JsValue]
[error]     val responseF = pipeline(Post("/api/1.0/users/ping.json", """{ "key": "whatever" }""".asJson))

также импорт, который у вас есть в вашем предыдущем снимке, не работает .... Я использую плохую версию библиотеки? Мои настройки sbt:

val sprayVersion = "1.1-M7"
val akkaVersion = "2.1.1"
"io.spray" %% "spray-json"   % "1.2.5",
    "com.typesafe.akka" %% "akka-actor" % akkaVersion,
    "com.typesafe.akka" %% "akka-slf4j" % akkaVersion,
    "io.spray" %  "spray-client" % sprayVersion,
person dzs    schedule 05.09.2013
comment
Должно быть import spray.httpx.SprayJsonSupport._. Обратите внимание на завершающий ._ - person jrudolph; 06.09.2013
comment
Также: попробуйте """{ "key": "whatever" }""".asJson.asJsObject из-за различия между JsonFormat и RootJsonFormat. - person jrudolph; 06.09.2013