В чем разница между extractStrictEntity и toStrictEntity в Akka HTTP? - PullRequest
0 голосов
/ 24 апреля 2018

В чем разница между extractStrictEntity и toStrictEntity?Вот код маршрута extractStrictEntity:

import scala.concurrent.duration._
val route = extractStrictEntity(3.seconds) { entity =>
  complete(entity.data.utf8String)
}

Код маршрута toStrictEntity:

import scala.concurrent.duration._
val route = toStrictEntity(3.seconds) { entity =>
  complete(entity.data.utf8String)
}

1 Ответ

0 голосов
/ 24 апреля 2018

Ваш второй маршрут, с toStrictEntity, не компилируется;он терпит неудачу с:

value data is not a member of akka.http.scaladsl.server.RequestContext

Что касается различия между двумя директивами, extractStrictEntity вызывает toStrictEntity:

def extractStrictEntity(timeout: FiniteDuration): Directive1[HttpEntity.Strict] =
  toStrictEntity(timeout) & extract(_.request.entity.asInstanceOf[HttpEntity.Strict])

// ...

def toStrictEntity(timeout: FiniteDuration): Directive0 =
// ...

Следующеедва маршрута по сути одинаковы:

val route1 = extractStrictEntity(3.seconds) { entity =>
  complete(entity.data.utf8String)
}

val route2 = toStrictEntity(3.seconds) {
  extractRequest { req =>
    req.entity match {
      case strict: HttpEntity.Strict =>
        complete(strict.data.utf8String)
      case _ =>
        complete("Request entity is not strict!")
    }
  }
}

extractStrictEntity возвращает Directive1[HttpEntity.Strict], что означает извлечение одного значения HttpEntity.Strict.С другой стороны, toStrictEntity возвращает Directive0, что означает, что он ничего не извлекает - отсюда и вложенный вызов extractRequest в приведенном выше примере.

...