My talk at Silicon Valley Code Camp 2013.
Two years ago I gave a talk on PlayFramework with Java at SVCC. As with everything, PlayFramework has evolved into a far mature ecosystem with native Scala support, and Typesafe backing. PlayFramework 2 is a simple, MVC-based, convention over configuration web application framework for Java and Scala. It is rapidly gaining popularity as more and more companies are adopting it for building scalable, performant, share-nothing architectures. In this talk I'll cover the fundamentals of Play! Framework2, a brief overview of Scala, and demonstrate building a simple, RESTful API. This will be a very interactive, and hands-on session. It'd be awesome if you have played around with Scala, but if you have not, the scope of this talk does not require you to be a Scala expert. It will however be very useful if you've worked with other Web Application Frameworks like Jersey, CXF, etc. so you can cross-relate the concepts.
4. Scala
Concise, yet expressive
Statically Typed via Type Inference
Rich Constructs
Functions as First Class Citizens
Power of DSL
Interoperability with the Java Ecosystem
8. Typesafe Activator
Use if you do not have an IDE
Use it to play with various templates it comes with
Yet to mature but a (very) good start
9. Play! Framework
Simple
Convention over Configuration
Focus on Developer Productivity
Asynchronous Processing Model
Makes testing easy
JSON support for RESTFul Applications
10. Play! Framework
Not a J2EE compatible framework
Does not follow the traditional request/response model
21. The almighty Action
A simple, no-request that returns a result.
A function that makes the Request available to the block
You can pass a BodyParser to the Action as an argument
Default BodyParsers are available for common content types
22. Play! Console Demo
run vs. ~run
With ~ run or run, change the app with syntax error
Fix the app and retry
Use the app with ~ test in Play! Console
Change the code and watch the tests fail
Change the tests and watch them pass
23. The Routes file
Type-safe way to define mappings from URLs to Actions
Rich support for basic data types
Handling of defaults
24. RESTFul APIs
Not JSON over HTTP
Not JSON representation of your Database
No Spec or official standard
25. RESTFul APIs
Envision the entities as HTTP resources
Envision the interactions as HTTP methods
Read RFC 2616
26. Play! Hands-on API
Model – A Person
APIs – Get all, Get by First/Last/Zip, Add a person
JSON Request and Response
28. Controller
object SimpleAPI extends Controller {
implicit val personWrites = Json.writes[Person]
implicit val personReads = Json.reads[Person]
def getAll = Action {
Ok(Json.toJson(PersonModel.getAll))
}
def add = Action(parse.json) { request =>
Logger.info(s"Body is $request.body")
request.body.validate(personReads) match {
case x: JsError =>
BadRequest
case x: JsSuccess[Person] =>
PersonModel.add(x.get)
Created
}
}
def getByFirstName(first: String) = Action {
val list = PersonModel.getByFirstName(first)
if (list.isEmpty) NotFound else Ok(Json.toJson(PersonModel.getByFirstName(first)))
}
}
29. Routes
# ~~~~
# Routes
# This file defines all application routes (Higher priority routes first)
# ~~~~
# Home page
GET /persons controllers.SimpleAPI.getAll
GET /persons/first/:first controllers.SimpleAPI.getByFirstName(first)
GET /persons/last/:last controllers.SimpleAPI.getByLastName(last)
GET /persons/zip/:zip controllers.SimpleAPI.getbyZip(zip:Int)
GET /persons/default controllers.SimpleAPI.getByFirstName(first="Manish")
POST /persons controllers.SimpleAPI.add