2013-06-09 28 views
8

Potrzebuję wykonać proste żądanie HTTP, korzystając z frameworka spray. Znalazłem kilka przykładów na ich stronie internetowej, ale okazało się, że są skomplikowane i dotyczą Akki, co nie jest mi potrzebne.Wysyłanie żądania wpisu w sprayu

Poza tym, muszę być w stanie wypełnić nagłówków żądania za (jak X-Application, content-type, etc) oraz, oczywiście, dane zamieścić żądań (w moim przypadku byłaby dane w formacie JSON).

Jak to zrobić?

+0

Zdajesz sobie sprawę, że Akka jest podstawowym elementem ramy rozpylania w prawo? Być może nie będziesz musiał bezpośrednio z nią współdziałać, ale jest to główny element konstrukcyjny, na którym jest zbudowany spray. – cmbaxter

+0

@cmbaxter i tak potrzebuję prostego przykładu, jak to zrobić, dlatego nie chcę używać akka w tym momencie. –

+0

Widziałeś tę stronę: http://spray.io/documentation/1.1-M8/spray-client. Nadal musisz zrozumieć niektóre z koncepcji sprayu, aby efektywnie z niego korzystać. – jrudolph

Odpowiedz

13

Oto przykład. Nie będzie niewielka ilość Akka kodu, ale jak już wspomniałem w moim komentarzu, że to konieczne dla rozpylaczy:

import spray.httpx.RequestBuilding._ 
import spray.http._ 
import HttpMethods._ 
import HttpHeaders._ 
import MediaTypes._ 
import spray.json._ 
import DefaultJsonProtocol._ 
import spray.httpx.SprayJsonSupport._ 
import akka.actor.ActorSystem 
import spray.io.IOExtension 
import akka.actor.Props 
import spray.can.client.HttpClient 
import spray.client.HttpConduit 
import scala.concurrent.Future 
import scala.util.Failure 
import scala.util.Success 

case class MyObj(str:String, i:Int) 

object SprayExample { 
    implicit val myObjFormat = jsonFormat2(MyObj) 

    def main(args: Array[String]) { 
    import concurrent.ExecutionContext.Implicits._ 

    val obj = MyObj("hello", 1) 
    val req = Post("/some/url", obj) ~> addHeader("X-Foo", "bar") 

    implicit val system = ActorSystem() 
    val ioBridge = IOExtension(system).ioBridge() 
    val httpClient = system.actorOf(Props(new HttpClient(ioBridge))) 

    val conduit = system.actorOf(
     props = Props(new HttpConduit(httpClient, "localhost", 8080)), 
     name = "http-conduit" 
    ) 

    val pipeline = HttpConduit.sendReceive(conduit) 
    val response: Future[HttpResponse] = pipeline(req) 
    response onComplete{ 
     case Failure(ex) => ex.printStackTrace() 
     case Success(resp) => println("success: " + resp.status) 
    } 
    } 
} 

Mój plik build wygląda tak:

scalaVersion := "2.10.0" 

resolvers ++= Seq(
    "Scala Tools Repo Releases" at "http://scala-tools.org/repo-releases", 
    "Typesafe Repo Releases" at "http://repo.typesafe.com/typesafe/releases/", 
    "spray" at "http://repo.spray.io/" 
) 


libraryDependencies ++= Seq(
    "io.spray" % "spray-httpx" % "1.1-M7", 
    "io.spray" % "spray-client" % "1.1-M7", 
    "com.typesafe.akka" %% "akka-actor" % "2.1.0", 
    "io.spray" %% "spray-json" % "1.2.5" 
) 
Powiązane problemy