Как действие может передать, что у него нет тела, использующего тип? - PullRequest
2 голосов
/ 24 сентября 2019

Действие в контроллере имеет тип Action [A], что означает, что тело является A (то есть должно анализироваться на A).

Я бы хотел посмотреть на подпись действия и узнать, нет ли у нее тела, что полезно, например, для запросов GET.
например, вот пример кода с двумя действиями, одно из которых принимает Personв теле и теле, которое не имеет тела:

case class Person(name: String)
implicit val personFormats: Format[Person] = Json.format[Person]
val people: mutable.Set[Person] = mutable.Set(Person("alice"), Person("bob"))

/** here it is clear that the body should contain a person info, since the method returns `Action[Person]` */
def createPerson(): Action[Person] =
  Action(parse.json[Person]) { request: Request[Person] =>
    val person: Person = request.body
    if (people.add(person))
      Ok(s"added ${person.name}")
    else
      Ok(s"${person.name} is already there :) nothing special to do")
  }

/** Can it be clearer from the signature that there's no body? */
def findPerson(name: String): Action[AnyContent] =
  Action {
    people.find(_.name == name) match {
      case Some(person) => Ok(Json.toJson(person))
      case None => NotFound(s"no person named $name")
    }
}

Когда я смотрю на тело второго действия, findPerson, из Action(parse.empty) становится ясно, что тело пусто.
Как это может быть ясно из подписи, не портя тело?

Возвращение Action[AnyContentAsEmpty] не может работать, поскольку play.api.mvc.AnyContentAsEmpty является объектом.

Существует следующая версия, в которой мы передаем parse.empty в качестве синтаксического анализатора, и он будет работать, но requestне используется, и мне интересно, есть ли другой способ:

def findPerson2(name: String): Action[Unit] =
    Action(parse.empty) { request =>
      people.find(_.name == name) match {
        case Some(person) => Ok(Json.toJson(person))
        case None => NotFound(s"no person named $name")
      }
    }

1 Ответ

1 голос
/ 24 сентября 2019

Рассмотрим EssentialAction, который в дополнительном дизайне не имеет синтаксического анализатора тела, подобного этому

def findPerson(name: String) = 
  EssentialAction { _ =>
    people.find(_.name == name) match {
      case Some(person) => Accumulator.done(Ok(Json.toJson(person)))
      case None => Accumulator.done(NotFound(s"no person named $name"))
    }
}

или ActionBuilder.IgnoringBody(), как этот

val ignoringBodyAction = new ActionBuilder.IgnoringBody()(executionContext)
def findPerson(name: String) =
  ignoringBodyAction {
    people.find(_.name == name) match {
      case Some(person) => Ok(Json.toJson(person))
      case None => NotFound(s"no person named $name")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...