使用Spring Boot和Kotlin创建可以进行CRUD操作的API的方法
我們將使用Spring Boot和Kotlin來創建可以進行CRUD操作的API。
环境
Docker: 18.09.2
Springboot: 2.1.5
Kotlin: 1.3.31
MySQL: 5.7.26
Docker:18.09.2
Springboot:2.1.5
Kotlin:1.3.31
MySQL:5.7.26
创建项目
首先,我们来创建一个Spring Boot项目。
1. 访问 Sprin Initializr。
2. 项目可以选择 Maven 或 Gradle,语言选择 Kotlin,选择 Spring Boot 的版本为 2.X 及以上。
3. 根据需要修改项目元数据。本次选择的 artifact 是 sample_qiita。
4. 选择 Web、JPA 和 MySQL 作为依赖项。
5. 最后点击 Generate Project 下载已完成设置的项目,并在本地打开。
我认为在本地的IDE中打开时,目录结构应如下所示。
sample_qiita
├ .idea
├ .gradle
├ src
│ ├ main
│ │ ├ kotlin
│ │ │ └ com.example.sample_qiita
│ │ │ └ SampleQiitaAppllication.kt
│ │ └ resources
│ │ ├ static
│ │ ├ templates
│ │ └ application.properties
│ └ test
│ └ kotlin
│ └ com.example.sampleqiita
│ └ SampleQiitaAppllicationTests
├ .gitignore
├ build.gradle.kt
・
・
・
└ External Libraries
MySQL的连接设置
由于我想要创建一个Docker容器并在其中使用MySQL,因此我将根据这篇文章在sample_qiita下创建docker-compose.yml文件。
db:
image: mysql:5.7
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: sample_qiita_db
MYSQL_ROOT_USER: root
MYSQL_ROOT_PASSWORD: root
下一步,需要对MySQL的URL、用户名和密码进行配置,以使Spring Boot能够创建数据源。请编辑src/main/resources/application.properties文件。
## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
spring.datasource.url = jdbc:mysql://127.0.0.1:3306/sample_qiita_db?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false
spring.datasource.username = root
spring.datasource.password = root
## Hibernate Properties
# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto = update
现在可以连接到Docker容器上的MySQL了。
建立模型
让我们创建一个实体。
在com.example.sample_qiita包内创建一个名为model的包,并在其中创建一个名为Qiita.kt的文件。
package com.example.sample_qiita.model
import javax.persistence.Entity
import javax.persistence.GeneratedValue
import javax.persistence.GenerationType
import javax.persistence.Id
import javax.validation.constraints.NotBlank
@Entity
data class Qiita (
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long = 0,
@get: NotBlank
val title: String = "",
@get: NotBlank
val content: String = ""
)
这次我们为Qiita类的所有字段设置了默认值。
这是因为Hibernate需要一个没有参数的构造函数来创建实体。
如果为所有字段分配默认值,则Hibernate可以实例化Qiita而无需传递参数。
创建存储库
在con.example.sample_qiita中创建一个repository包,并在其中创建一个QiitaRepository.kt文件。
package com.example.sample_qiita.repository
import com.example.sample_qiita.model.Qiita
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository
@Repository
interface QiitaRepository: JpaRepository<Qiita, Long>
由于这个操作,我们现在可以通过扩展JpaRepository来使用QiitaRepository,以便使用Qiita实体的所有CRUD方法。
创建控制器
请创建一个用于对Qiita实体执行CRUD操作的控制器。
在`com.example.sample_qiita`包中创建一个名为`controller`的包,并在其中创建`QiitaController.kt`文件。
package com.example.sample_qiita.controller
import com.example.sample_qiita.model.Qiita
import com.example.sample_qiita.repository.QiitaRepository
import org.springframework.http.HttpStatus
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.*
import javax.validation.Valid
@RestController
@RequestMapping("/api")
class QiitaController(private val qiitaRepository: QiitaRepository) {
@GetMapping("/qiitas")
fun getAllQiitas(): List<Qiita> =
qiitaRepository.findAll()
@PostMapping("/qiitas")
fun createNewQiita(@Valid @RequestBody qiita: Qiita): Qiita =
qiitaRepository.save(qiita)
@GetMapping("/qiitas/{id}")
fun getQiitaBiId(@PathVariable(value = "id") qiitaed: Long): ResponseEntity<Qiita> {
return qiitaRepository.findById(qiitaed).map { qiita ->
ResponseEntity.ok(qiita)
}.orElse(ResponseEntity.notFound().build())
}
@PutMapping("/qiitas/{id}")
fun updateQiitaById(@PathVariable(value = "id") qiitaed: Long,
@Valid @RequestBody newQiita: Qiita): ResponseEntity<Qiita> {
return qiitaRepository.findById(qiitaed).map { existingQiita ->
val updateQiita: Qiita = existingQiita
.copy(title = newQiita.title, content = newQiita.content)
ResponseEntity.ok().body(qiitaRepository.save(updateQiita))
}.orElse(ResponseEntity.notFound().build())
}
@DeleteMapping("/qiitas/{id}")
fun deleteQiitaById(@PathVariable(value = "id") qiitaed: Long): ResponseEntity<Void> {
return qiitaRepository.findById(qiitaed).map { qiita ->
qiitaRepository.delete(qiita)
ResponseEntity<Void>(HttpStatus.OK)
}.orElse(ResponseEntity.notFound().build())
}
}
因为以上所述,应用程序已经完成了,所以让我们立即测试一下吧。
启动方式
首先启动Docker容器。
$ docker-compose up -d
我们来运行下面创建的sample_qiita。
如果访问http://localhost:8080/api/qiitas时,显示一个空数组[],那么就表示成功。
对Rest API进行操作验证
让我们使用curl命令来测试是否可以获得正确的响应。
创建Qiita
我们将通过对/api/articles进行POST请求并发送数据,以确保是否成功创建了一个新的Qiita。
让我们尝试在命令行中执行以下内容。
curl -i -H "Content-Type: application/json" -X POST \
-d '{"title": "Create API by Spring Boot and Kotlin", "content": "Text of creating API"}' \
http://localhost:8080/api/qiitas
当执行此操作时,我认为会返回以下反应。
HTTP/1.1 200
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Wed, 05 Jun 2019 06:21:52 GMT
{"id":1,"title":"Create API by Spring Boot and Kotlin","content":"Text of creating API"}
新的Qiita数据已经成功保存到数据库中了。要确认,请访问http://localhost:8080/api/qiitas,或尝试以下方式。
获取所有数据。
让我们立即尝试输入下一行的命令。
curl -i -H 'Accept: application/json' http://localhost:8080/api/qiitas
HTTP/1.1 200
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Fri, 06 Oct 2017 03:25:29 GMT
{"id":1,"title":"Create API by Spring Boot and Kotlin","content":"Text of creating API"}
你好好地回来了呢!我想你会收到我们创建的所有Qiita数据。
获取使用ID指定的Qiita。
這是一個只獲取指定ID數據的命令。
curl -i -H 'Accept: application/json' http://localhost:8080/api/qiitas/1
HTTP/1.1 200
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Wed, 05 Jun 2019 06:33:27 GMT
{"id":1,"title":"Create API by Spring Boot and Kotlin","content":"Text of creating API"}
在URL(localhost:8080/api/qiitas/{id})的末尾,将获取与指定数字相同ID的Qiita数据。
当然,如果指定了不存在的ID号码,将返回404错误,请注意。
更新已创建的Qiita数据
要更新已经注册的数据,请使用PUT方法。
curl -i -H "Content-Type: application/json" -X PUT \
-d '{"title": "How to learn Spring boot and Kotlin", "content": "Resources to learn Spring boot and Kotlin"}' \
http://localhost:8080/api/qiitas/1
HTTP/1.1 200
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Wed, 05 Jun 2019 06:45:18 GMT
{"id":1,"title":"How to learn Spring boot and Kotlin","content":"Resources to learn Spring boot and Kotlin"}
删除Qiita数据。
要进行删除操作,需要使用DELETE方法。
curl -i -X DELETE http://localhost:8080/api/qiitas/1
HTTP/1.1 200
Content-Length: 0
Date: Wed, 05 Jun 2019 06:47:21 GMT
文献引用
使用Kotlin、Spring Boot、Mysql、JPA和Hibernate构建Restful API