
構建API時值得使用的4個實用VS Code擴展
在開始之前,確保您具備以下技能和工具:
java -version
安裝完成后,您就可以開始構建REST API了。
sbt new playframework/play-scala-seed.g8
name [play-scala-seed]: rest-api-demo
organization [com.example]: com.mycompany
cd rest-api-demo
sbt run
首次運行可能需要幾分鐘以下載依賴項。完成后,訪問 http://localhost:9000
查看默認歡迎頁面。
Play框架采用標準化的項目布局,主要目錄包括:
app/controllers/
:存放API端點邏輯。app/models/
:定義數據模型。app/views/
:存放HTML模板(REST API中較少使用)。在項目根目錄的 build.sbt
文件中添加以下依賴項:
libraryDependencies ++= Seq(
"com.typesafe.play" %% "play-slick" % "5.0.0",
"org.postgresql" % "postgresql" % "42.3.1"
)
規劃API端點是構建REST API的第一步。例如,構建一個待辦事項應用程序需要以下端點:
GET /todos
:獲取所有待辦事項。POST /todos
:創建新的待辦事項。PUT /todos/:id
:更新指定的待辦事項。DELETE /todos/:id
:刪除指定的待辦事項。在Scala中,使用案例類定義數據模型。例如:
case class Todo(id: Long, description: String, isComplete: Boolean)
對于創建操作,可以定義一個簡化的DTO(數據傳輸對象):
case class NewTodo(description: String)
根據操作選擇合適的HTTP方法:
控制器負責處理API請求和業務邏輯。以下是實現控制器的步驟:
app/controllers
目錄中創建一個新文件,例如 TodoController.scala
。定義一個擴展 AbstractController
的類,并使用依賴注入:
package controllers
import javax.inject._
import play.api.mvc._
@Singleton
class TodoController @Inject()(cc: ControllerComponents) extends AbstractController(cc) {
// 控制器方法
}
以下是一個示例代碼,展示如何實現基本的CRUD操作:
def getAll(): Action[AnyContent] = Action.async { implicit request =>
todoService.listAllItems.map { items =>
Ok(Json.toJson(items))
}
}
def add(): Action[AnyContent] = Action.async { implicit request =>
TodoForm.form.bindFromRequest.fold(
errorForm => Future.successful(BadRequest("表單提交錯誤")),
data => {
val newTodo = Todo(0, data.name, false)
todoService.addItem(newTodo).map(_ => Created)
}
)
}
在 conf/routes
文件中添加以下內容:
GET /todos controllers.TodoController.getAll()
POST /todos controllers.TodoController.add()
PUT /todos/:id controllers.TodoController.update(id: Long)
DELETE /todos/:id controllers.TodoController.delete(id: Long)
在 conf/application.conf
文件中添加數據庫配置:
db.default.driver = org.postgresql.Driver
db.default.url = "jdbc:postgresql://localhost/playdb"
db.default.username = "playdbuser"
db.default.password = "your_strong_password"
在 build.sbt
中添加Slick依賴:
libraryDependencies ++= Seq(
"com.typesafe.play" %% "play-slick" % "5.0.0",
"com.typesafe.play" %% "play-slick-evolutions" % "5.0.0"
)
定義一個數據訪問對象(DAO)以操作數據庫:
case class User(id: Long, name: String, email: String)
class UserRepository @Inject()(protected val dbConfigProvider: DatabaseConfigProvider)
extends HasDatabaseConfigProvider[JdbcProfile] {
import profile.api._
private val Users = TableQuery[UsersTable]
def add(user: User): Future[Unit] = db.run(Users += user).map(_ => ())
private class UsersTable(tag: Tag) extends Table[User](tag, "users") {
def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
def name = column[String]("name")
def email = column[String]("email")
def * = (id, name, email) ((User.apply _).tupled, User.unapply)
}
}
使用Scala的 Future
實現非阻塞操作:
def parallelComputation(): Future[Int] = async {
val result1 = slowComputation()
val result2 = anotherSlowComputation()
await(result1) + await(result2)
}
在 build.sbt
中添加緩存依賴:
libraryDependencies += "com.typesafe.play" %% "play-ehcache" % "2.8.0"
在控制器中實現緩存:
import play.api.cache._
class MyController @Inject()(cache: SyncCacheApi) extends Controller {
def getData = Action {
val data = cache.getOrElseUpdate("myKey") {
expensiveDataFetch()
}
Ok(data)
}
}
創建一個 Dockerfile
:
FROM openjdk:11-jre-slim
COPY target/universal/stage /app
WORKDIR /app
CMD ["bin/your-app", "-Dplay.http.secret.key=your_secret_key"]
構建并運行Docker鏡像:
docker build -t your-app .
docker run -p 9000:9000 your-app
使用Scala Play框架構建REST API需要從項目設置到部署的全面規劃。通過本文的指導,您可以:
通過不斷實踐和學習,您將能夠構建出健壯且高效的REST API。
原文鏈接: https://daily.dev/blog/build-rest-api-with-scala-play-framework