Doing HTTP request in Scala
I am trying to issue a simple POST request to a webservice which returns some XML in Scala.
It seems that Dispatch is the standard library used for this task, but I cannot find documentation for it. The main site, which I link above, explains at length what is a promise and how to do asynchronous programming, but does not actually document the API. There is a periodic table - which looks a bit scary - but it only seems useful to people who already know what to do and only need a reminder for the cryptic syntax.
It also seems that Scalaz has some facility for HTTP, but I cannot find any documentation for it either.
I use the following: https://github.com/scalaj/scalaj-http.
Here's a simple GET request:
import scalaj.http.{Http, HttpOptions}
Http("http://example.com/search").param("q", "monkeys").asString
and an example of a POST:
val result = Http("http://example.com/url").postData("""{"id":"12","json":"data"}""")
.header("Content-Type", "application/json")
.header("Charset", "UTF-8")
.option(HttpOptions.readTimeout(10000)).asString
Scalaj HTTP is available through SBT:
libraryDependencies += "org.scalaj" % "scalaj-http_2.11" % "2.3.0"
You could use spray-client. The documentation is lacking (it took me some digging to find out how to make GET requests with query parameters) but it's a great option if you are already using spray. And the documentation is better than dispatch.
We're using it at AI2 over dispatch because the operators are less symbolic and we're already using spray/actors.
import spray.client.pipelining._
val url = "http://youruri.com/yo"
val pipeline: HttpRequest => Future[HttpResponse] = sendReceive
// Post with header and parameters
val responseFuture1: Future[String] = pipeline(Post(Uri(url) withParams ("param" -> paramValue), yourPostData) map (_.entity.asString)
// Post with header
val responseFuture2: Future[String] = pipeline(Post(url, yourPostData)) map (_.entity.asString)