[Lift Web Framework] Exemplo mínimo de API REST

RestHelper

RestHelper é uma característica fornecida pelo framework web Lift , que nos permite criar a API Rest de uma forma simples e bonita.

Já existem muitos exemplos de RestHelper, mas acho que muitos desses exemplos são um pouco longos, então criei uma API REST Json realmente mínima de um artigo de blog, que oferece suporte a solicitações GET / POST e DELETE.

Modelo de Blog

Como precisamos de suporte para POST e DELETE, precisamos de um objeto de modelo simples para simular a camada de persistência.

Aqui está o código do Model; se você estiver familiarizado com Scala, deve ser bem fácil de entender.

case class Article(id: Int, title: String, content: String) {
def toJSON = {
import net.liftweb.json._
import net.liftweb.json.JsonDSL._

("id" -> id) ~ ("title" -> title) ~ ("content" -> content)
}
}

object Article {

var store: List[Article] = Article(12, "qqq", "sss") :: Nil

def addArticle(title: String, content: String): Article = {
val nextID
= store.map(_.id).max + 1
val newArticle
= new Article(nextID, title, content)
store
::= newArticle
newArticle

}

def getArticle(id: Int): Option[Article] = store.filter(_.id == id).headOption
def deleteArticle(id: Int) { store = store.filterNot(_.id == id) }
}

Auxiliar REST da API do Blog

Em seguida, precisamos implementar o traço RestHelper.

A parte mais importante do código a seguir é serve, que utiliza a função parcial / correspondência de padrão para determinar se aceitamos essa solicitação, que tipo de solicitação ela é e redireciona para o método correspondente.

import net.liftweb.http.rest.RestHelper
import net.liftweb.http.OkResponse
import net.liftweb.util.Helpers.AsInt

object BlogAPI extends RestHelper {

def getArticleJSON(postID: Int): Option[JValue] = {
Article.getArticle(postID).map(_.toJSON)
}

def deleteArticle(postID: Int) = {
Article.deleteArticle(postID)
new OkResponse
}

def postArticle(jsonData: JValue): JValue = {
Article.addArticle(
title
= (jsonData "title").extract[String],
content
= (jsonData "content").extract[String]
).toJSON
}

serve
{
case "api" :: "blog" :: AsInt(postID) :: Nil JsonGet req => getArticleJSON(postID)
case "api" :: "blog" :: AsInt(postID) :: Nil JsonDelete req => deleteArticle(postID)
case "api" :: "blog" :: Nil JsonPost ((jsonData, req)) => postArticle(jsonData)
}
}

Boot.scala

Finalmente, precisamos anexar BlogAPIà tabela de despacho de Lift em Boot.scala.

class Boot
{
def boot
{
LiftRules.dispatch.append(BlogAPI)
}
}