Search code examples
javascalaspray

Scala with Spray Routing - accessing GET parameters?


I'm currently working on an application built in Scala with Spray routing.

So for dealing with a JSON document sent over POST, it's pretty easy to access the variables within the body, as follows;

respondWithMediaType(`application/json`) {
    entity(as[String]) { body =>
        val msg = (parse(body) \ "msg").extract[String]
        val url = (parse(body) \ "url").extractOpt[String]

However, I'm now trying to write an additional query with GET, and am having some issues accessing the parameters sent through with the query.

So, I'm opening with;

get {
    respondWithMediaType(`application/json`) {
    parameterSeq { params =>
        var paramsList = params.toList

So, this works well enough in that I can access the GET params in a sequential order (just by accessing the index) - the problem is, unfortunately I don't think we can expect GET params to always be sent in the correct order.

The list itself prints out in the following format;

List((msg,this is a link to google), (url,http://google.com), (userid,13))

Is there any simple way to access these params? For example, something along the lines of;

var message = paramsList['msg']
println(message) //returns "this is a link to google"

Or am I going about this completely wrong?

Apologies if this is a stupid question - I've only switched over to Scala very recently, and am still getting both acquainted with that, and re-acquainted with Java.


Solution

  • What I usually do is use the parameters directive to parse the data out to a case class which contains all the relevant data:

    case class MyParams(msg: String, url: String, userId: Int)
    
    parameters(
      "msg".as[String],
      "url".as[String],
      "userId".as[Int]
    ).as[MyParams] {
      myParams => 
       // Here you have the case class containing all the data, already parsed.
    }