Спрей: маршрутизация-поймите разницу между path и pathPrefix

import akka.actor.Actor
import spray.routing.HttpService
import spray.http._
import MediaTypes._
import spray.json._
import spray.routing.directives.CachingDirectives._
import spray.httpx.encoding._

trait MarginEvaluationService extends HttpService {
  import ClassSerializer._
  import spray.httpx.SprayJsonSupport._
  val myRoute = {

      pathPrefix("hello") {
        get {
          respondWithMediaType(`text/html`) { // XML is marshalled to `text/xml` by default, so we simply override here
            complete {
              <html>
                <body>
                  <h1>Say hello to <i>spray-routing</i> on <i>spray-can</i>!</h1>
                </body>
              </html>
            }
          }
        }
      }
      ~
      pathPrefix("testjson") {
        get {
          entity(as[TestC]) { c =>
            respondWithMediaType(`application/json`) {
              complete(c)
            }
          }
        }
      }
   }
}

на маршрут прослушивается:

Error: (49, 1) незаконный запуск простого выражения pathPrefix("testjson") { ^

в чем разница между path и pathPrefix? Я не уверен, если ~ оператор неправильно включен.

1 ответов


path является окончательным путем, в то время как pathPrefix может быть впоследствии объединен с другими сегментами пути с помощью DSL.

если вы хотите, чтобы соответствовать именно /hello вы должны использовать path("hello").

pathPrefix удобно в таких случаях, как

pathPrefix("hello") {
  path("foo") {
    complete("foo")
  } ~
  path("bar") {
    complete("bar")
  }
}

что будет соответствовать /hello/foo и /hello/bar.


это, как говорится, Я подозреваю, что ошибка, которую вы получаете, - это просто парсер scala, не ладящий с DSL.

Can попробуйте переместить ~ на той же линии, что и закрывающая скобка? Я думаю, что парсер выводит точку с запятой, поэтому он действительно понимает этот кусок кода как

pathPrefix("hello") {
    get {
      respondWithMediaType(`text/html`) { // XML is marshalled to `text/xml` by default, so we simply override here
        complete {
          <html>
            <body>
              <h1>Say hello to <i>spray-routing</i> on <i>spray-can</i>!</h1>
            </body>
          </html>
        }
      }
    }
  };
  ~
  pathPrefix("testjson") {
    get {
      entity(as[TestC]) { c =>
        respondWithMediaType(`application/json`) {
          complete(c)
        }
      }
    }
  }