Scala for Backend Engineering & Functional Programming · 课时

使用 Play 构建 RESTful API

使用 Play 控制器设计并实现 RESTful 端点、处理请求,以及管理 JSON 数据。

第 2 / 3 课11 个步骤

使用 Play 构建 RESTful API 是 CoddyKit 上的免费 Scala for Backend Engineering & Functional Programming 课时。 这是第 2 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Scala for Backend Engineering & Functional Programming 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Scala for Backend Engineering & Functional Programming 课程共包含 3 节课。

Play REST API 简介

欢迎!本课程将深入介绍如何使用 Scala Play 框架构建 RESTful API。REST(表述性状态转移)是一种广泛用于设计网络应用程序的架构风格。

RESTful API 允许不同的软件系统通过互联网相互通信,通常使用 GET、POST、PUT 和 DELETE 等标准 HTTP 方法来操作资源。

Play 控制器与操作

在 Play 中,传入的 HTTP 请求由控制器处理。控制器是包含操作方法的 Scala 对象或类。

每个操作方法负责处理特定类型的请求(例如获取数据或创建新项目),并返回 HTTP 响应。

在 Play 中定义路由

Play 使用 conf/routes 文件,将传入的 HTTP 请求映射到特定的控制器操作方法。您可以在这里定义 API 的端点。

路由条目的基本语法是:HTTP_METHOD /path controllers.ControllerName.actionMethod(parameters)。

实现 GET 端点

让我们创建一个返回问候语的简单 GET 端点。在实际的 Play 应用程序中,这段代码会位于控制器内部。这里,我们在 main 方法中模拟其逻辑。

请尝试运行此示例:

object GreetingController {
  // This method simulates a Play controller action
  def sayHello(): String = {
    "Hello from your Play API!"
  }
  
  def main(args: Array[String]): Unit = {
    // Simulate receiving a request and calling the action
    val apiResponse = sayHello()
    println(s"Simulated API Response: $apiResponse")
  }
}

提取路径参数

您经常需要从 URL 路径中提取动态值,例如项目 ID。这些值称为路径参数。

在 routes 文件中,您可以使用冒号(:)定义它们。在控制器操作中,您需要将它们声明为方法参数。

object UserController {
  // This action takes an 'id' as a path parameter
  def getUser(id: Int): String = {
    s"Fetching user details for ID: $id"
  }
  
  def main(args: Array[String]): Unit = {
    // Simulate a request to /users/123
    val userIdFromRequest = 123
    val apiResponse = getUser(userIdFromRequest)
    println(s"Simulated API Response: $apiResponse")
  }
}

请求正文与 JSON

在创建或更新资源时,客户端会在请求正文中发送数据。对于 RESTful API,这些数据几乎总是采用 JSON(JavaScript 对象表示法)格式。

Play 为解析 JSON 请求正文并将其转换为 Scala case class 提供了出色的支持。

构建 POST 端点

让我们模拟一个接收 JSON 正文的 POST 端点。在实际的 Play 应用程序中,您会使用 Play 的 JSON 库来解析请求。在这个可运行的示例中,我们将检查简单的字符串内容。

请尝试运行此示例:

object ItemController {
  // Simulate processing a JSON request body
  def createItem(jsonBody: String): String = {
    // In a real Play app: Json.parse(jsonBody).as[ItemCaseClass]
    if (jsonBody.contains("name") && jsonBody.contains("price")) {
      s"Item successfully created! Data: $jsonBody"
    } else {
      "Error: Invalid JSON format. 'name' and 'price' expected."
    }
  }
  
  def main(args: Array[String]): Unit = {
    // Simulate a POST request with a JSON body
    val validJson = """{"name": "Smartphone", "price": 799.99}"""
    println(s"Valid JSON Response: ${createItem(validJson)}")
    
    val invalidJson = """{"product": "Tablet"}"""
    println(s"Invalid JSON Response: ${createItem(invalidJson)}")
  }
}

处理 PUT 和 DELETE

除了 GET 和 POST 之外,RESTful API 还经常使用:

  • PUT:用于更新现有资源。通常需要路径参数(ID)和请求正文(更新后的数据)。
  • DELETE:用于删除资源。通常只需要路径参数(ID)。

为 PUT 和 DELETE 定义路由以及访问参数和正文的方式,与 POST 和 GET 类似。

返回 JSON 响应

处理请求后,您的 API 通常需要返回响应,响应通常采用 JSON 格式。Play 让您可以轻松构建 JSON 对象并将其返回。

在控制器中,您通常会使用 Ok(Json.toJson(yourCaseClass))。这里,我们将模拟创建一个 JSON 字符串。

object ResponseGenerator {
  // Simulate a case class for the response data
  case class ApiResponse(status: String, message: String)

  // Simulate converting the case class to a JSON string
  def buildJsonResponse(response: ApiResponse): String = {
    s"""{"status": "${response.status}", "message": "${response.message}"}"""
  }

  def main(args: Array[String]): Unit = {
    val successResponse = ApiResponse("success", "Data retrieved successfully")
    println(s"Simulated JSON Output:\n${buildJsonResponse(successResponse)}")

    val errorResponse = ApiResponse("error", "Item not found")
    println(s"Simulated JSON Output:\n${buildJsonResponse(errorResponse)}")
  }
}

路由匹配测验

哪个 Play 路由定义能够正确匹配请求 GET /api/products/123,并将 123 作为 Int 传递给控制器操作?

回顾与后续步骤

做得很好!您已经学习了使用 Play Framework 构建 RESTful API 的基础知识:

  • 了解 RESTful 原则和 HTTP 方法。
  • 了解 Play 控制器和操作如何处理请求。
  • 定义 API 路由,将 URL 映射到控制器操作。
  • 从 URL 中提取路径参数。
  • 处理 POST/PUT 的 JSON 请求体。
  • 构造并返回 JSON 响应。

接下来,您可以探索如何将数据库集成到 Play 应用程序中!

免费开始

用 AI 导师学习 Scala — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
39
课程
143

常见问题解答

「使用 Play 构建 RESTful API」课时是免费的吗?

是的 — 「使用 Play 构建 RESTful API」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Scala for Backend Engineering & Functional Programming 课程的其余内容,请升级到 CoddyKit PRO。 Scala for Backend Engineering & Functional Programming 课程共包含 3 节课。

「使用 Play 构建 RESTful API」这节课中我会学到什么?

使用 Play 控制器设计并实现 RESTful 端点、处理请求,以及管理 JSON 数据。 你通过在浏览器中直接运行的动手代码来练习 Scala for Backend Engineering & Functional Programming,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Scala for Backend Engineering & Functional Programming 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Scala for Backend Engineering & Functional Programming 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 3 节。

「使用 Play 构建 RESTful API」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Scala for Backend Engineering & Functional Programming 课中编写并运行代码吗?

能。每节 Scala for Backend Engineering & Functional Programming 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. Play Framework 基础
  2. 使用 Play 构建 RESTful API
  3. 使用 Slick/Doobie 集成数据库
← 返回 Scala for Backend Engineering & Functional Programming