Play! framework には、クエリ文字列などフォームの入力を処理するための仕組みがありますが、正規表現でチェックが可能です。公式ドキュメントに載ってなかったのでここで紹介します。
package controllers
import play.api._
import play.api.mvc._
import play.api.data._
import play.api.data.Forms._
import play.api.data.validation._
case class Hoge(hoge: String, fuga: Option[String])
object Application extends Controller {
def index = Action { implicit request =>
val form = Form(
mapping(
"hoge" -> text.verifying(Constraints.pattern("[a-z]+".r)),
"fuga" -> optional(text.verifying(Constraints.pattern("(HOGE|FUGA|PIYO)".r)))
)(Hoge.apply)(Hoge.unapply))
form.bindFromRequest.fold(
formWithErrors => BadRequest("error"),
hoge => Ok(hoge.toString)
)
}
}
text.verifying に、Constraints.pattern(正規表現) を指定すると正規表現で verify してくれます。オプショナルな場合でも、optional(text.verifying...) と記述することで、省略可能な形でチェックしてくれます。
ちなみにユニットテストとしては以下のような感じになります。
package controllers
import org.specs2._
import specification._
import play.api.test._
import play.api.test.Helpers._
class ApplicationSpec extends script.Specification with Grouped {
def is = s2"""
+ 正しいクエリ文字列を渡した場合、Ok になる
+ 間違ったクエリ文字列を渡した場合、BadRequest になる
+ オプションにも対応
"""
"" - new group {
eg := status(Application.index()(FakeRequest(GET, "/?hoge=abc"))) == OK
eg := status(Application.index()(FakeRequest(GET, "/?hoge=ABC"))) == BAD_REQUEST
eg := contentAsString(Application.index()(FakeRequest(GET, "/?hoge=abc&fuga=HOGE"))) == "Hoge(abc,Some(HOGE))"
}
}