Top Banner
Building APIs in Scala with Play! Framework 2 Silicon Valley Code Camp Oct 5 th , 2013 Manish Pandit @lobster1234
34

Building Apis in Scala with Playframework2

Jan 15, 2015

Download

Technology

Manish Pandit

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.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Building Apis in Scala with Playframework2

Building APIs in Scala with Play! Framework 2

Silicon Valley Code Camp

Oct 5th, 2013

Manish Pandit@lobster1234

Page 2: Building Apis in Scala with Playframework2

Manish Pandit

@lobster1234

[email protected]

linkedin.com/in/mpandit

slideshare.net/lobster1234

Page 3: Building Apis in Scala with Playframework2

Agenda

Scala

Typesafe Platform

PlayFramework

REST

Hands-on API

Open Floor

Page 4: Building Apis in Scala with Playframework2

Scala

Concise, yet expressive

Statically Typed via Type Inference

Rich Constructs

Functions as First Class Citizens

Power of DSL

Interoperability with the Java Ecosystem

Page 5: Building Apis in Scala with Playframework2

Typesafe Platform

Scala Programming Language

PlayFramework for Web Applications

sbt for builds

Akka

Typesafe Activator

Misc. Tools

Page 6: Building Apis in Scala with Playframework2

Typesafe Activator

A very simple way to start with Scala and Play!

Applications

Browser-based

Interactive

Comes with a good number of templates

Page 7: Building Apis in Scala with Playframework2

Typesafe Activator

Page 8: Building Apis in Scala with Playframework2

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

Page 9: Building Apis in Scala with Playframework2

Play! Framework

Simple

Convention over Configuration

Focus on Developer Productivity

Asynchronous Processing Model

Makes testing easy

JSON support for RESTFul Applications

Page 10: Building Apis in Scala with Playframework2

Play! Framework

Not a J2EE compatible framework

Does not follow the traditional request/response model

Page 11: Building Apis in Scala with Playframework2

Creating a Play! Project

Page 12: Building Apis in Scala with Playframework2

Using an IDE

Page 13: Building Apis in Scala with Playframework2

Eclipse Import

Page 14: Building Apis in Scala with Playframework2

Gotchas!

Start with a fresh installation of ScalaIDE

Go to Install New Software – Select ScalaIDE – Check

Play2 Plugin

Page 15: Building Apis in Scala with Playframework2

Run the App!

Page 16: Building Apis in Scala with Playframework2

And Play! with it

http://localhost:9000

Test the app with play test

Page 17: Building Apis in Scala with Playframework2

Play! Core Concepts

Uses sbt as the build system

(In a special way to support always-on builds)

Page 18: Building Apis in Scala with Playframework2

Play! Core Concepts

MVC

Folder Structure

Controllers

Routes File

Tests

Page 19: Building Apis in Scala with Playframework2

Play! Actions

In simple terms, an Action takes function, that takes a

request Request, and returns a Response.

Page 20: Building Apis in Scala with Playframework2

Play! Actions

All routable methods of a Controller are Actions

(Request => Result) function

Page 21: Building Apis in Scala with Playframework2

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

Page 22: Building Apis in Scala with Playframework2

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

Page 23: Building Apis in Scala with Playframework2

The Routes file

Type-safe way to define mappings from URLs to Actions

Rich support for basic data types

Handling of defaults

Page 24: Building Apis in Scala with Playframework2

RESTFul APIs

Not JSON over HTTP

Not JSON representation of your Database

No Spec or official standard

Page 25: Building Apis in Scala with Playframework2

RESTFul APIs

Envision the entities as HTTP resources

Envision the interactions as HTTP methods

Read RFC 2616

Page 26: Building Apis in Scala with Playframework2

Play! Hands-on API

Model – A Person

APIs – Get all, Get by First/Last/Zip, Add a person

JSON Request and Response

Page 27: Building Apis in Scala with Playframework2

Model

object PersonModel {

val persons = ArrayBuffer(Person("Manish", "Pandit", 94568), Person("John", "Doe", 95051), Person("My", "Neighbor", 94568))

def add(p: Person) = persons += p

def getAll = persons

def getByFirstName(first: String) = persons.filter(_.first == first)

def getByLastName(last: String) = persons.filter(_.last == last)

def getByZip(zip: Int) = persons.filter(_.zip == zip)

}

case class Person(first: String, last: String, zip: Int)

Page 28: Building Apis in Scala with Playframework2

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))) }

}

Page 29: Building Apis in Scala with Playframework2

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

Page 30: Building Apis in Scala with Playframework2

Play! Packaging

Use play dist to package the app as a zip file

Run using the start script

Page 31: Building Apis in Scala with Playframework2

Play! Advanced Topics

Reactive Programming

Akka, Futures, Promises

Play WS Library

Anorm and Slick

Page 32: Building Apis in Scala with Playframework2

Further reading

http://www.playframework.com/

http://typesafe.com/platform

StackOverflow

Source : https://github.com/lobster1234/SVCC2013

Page 33: Building Apis in Scala with Playframework2

We are hiring!

netflix.github.io

techblog.netflix.com

jobs.netflix.com

Page 34: Building Apis in Scala with Playframework2

Fin

Manish Pandit

@lobster1234

[email protected]

linkedin.com/in/mpandit

slideshare.net/lobster1234