Действие в контроллере имеет тип 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")
}
}