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
Another option is Typesafe's play-ws, which is the Play Framework WS library broken out as a standalone lib:
http://blog.devalias.net/post/89810672067/play-framework-seperated-ws-library
I wouldn't necessarily offer this as the best option, but worth mentioning.
Here is a class I was working on. It has both GET and POST requests. GET without parameters - POST with parameters I used it to communicate with StreamSets in order to start a pipeline or check a pipeline status.
it only need the following dependency in the build.sbt file:
libraryDependencies += "org.scalaj" %% "scalaj-http" % "2.3.0"
You can find the documentation here: https://github.com/scalaj/scalaj-http#post-raw-arraybyte-or-string-data-and-get-response-code
import scala.collection.mutable.ArrayBuffer
import scalaj.http.{Http, HttpResponse}
object HttpRequestHandler {
val userName: String = "admin"
val password: String = "admin"
def sendHttpGetRequest(request: String): String = {
println(" Send Http Get Request (Start) ")
try {
val httpResponse: HttpResponse[String] = Http(request).auth(userName,password)
.asString
val response = if (httpResponse.code == 200) httpResponse.body
else{
println("Bad HTTP response: code = "+httpResponse.code )
return "ERROR"
}
println(" Send Http Get Request (End) ")
return response
} catch {
case e: Exception => println("Error in sending Get request: "+e.getMessage)
return "ERROR"
}
}
def arrayBufferToJson(params:ArrayBuffer[(String,String)]): String ={
var jsonString = "{"
var count: Int = 0
for(param <- params){
jsonString+="\""+param._1+"\":\""+param._2+"\""+ ( if(count!=params.length-1) "," else "")
count+=1
}
jsonString+="}"
return jsonString
}
def sendHttpPostRequest(request: String,params: ArrayBuffer[(String,String)]): String = {
println(" Send Http Post Request (Start) ")
try {
val postData : String = arrayBufferToJson(params)
println("Parameters: "+postData)
val httpResponse: HttpResponse[String] = Http(request).auth(userName,password)
.header("X-Requested-By","sdc")
.header("Content-Type", "application/json;charset=UTF-8")
.header("X-Stream" , "true")
.header("Accept", "application/json")
.postData(postData.getBytes)
.asString
val response = if (httpResponse.code == 200) httpResponse.body
else{
println("Bad HTTP response: code = "+httpResponse.code )
"ERROR"
}
println(" Send Http Post Request (End) ")
return response
} catch {
case e: Exception => println("Error in sending Post request: " + e.getMessage)
return "ERROR"
}
}
}
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"