1. 使用 Idea 创建 Spring Initializer 项目

在创建项目的对话框中添加 Web 和 Lombok,或者建立项目后在 pom.xml 中添加依赖:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>

2. 使用注解构建 RESTful API

此处没有使用数据库,用 ArrayList 作为操作对象。

创建一个实体类,作为 API 操作的对象

package top.cloudli.demo.model;

import lombok.AllArgsConstructor;
import lombok.Data; @Data
@AllArgsConstructor
public class Character {
private int id;
private String name;
private String racial;
private String[] ability;
}

这里使用了 lombok,省去了编写 Getter、Setter 以及构造函数,添加相应的注解后 lombok 会自动生成。

创建 Controller,实现 RESTful API

@RestController 相当于 @Controller 和 @ResponseBody 的组合,使用该注解后,MIME 默认为 application/json。

@GetMapping 相当于 @RequestMapping(method = {RequestMethod.GET}),其他注解类似。

package top.cloudli.demo.controller;

import org.springframework.web.bind.annotation.*;
import top.cloudli.demo.model.Character; import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
import java.util.stream.Stream; /**
* CRUD for Character
*/
@RestController
@RequestMapping(path = "/character")
public class CharacterController { private ArrayList<Character> characters = (ArrayList<Character>) Stream.of(
new Character(1, "罗小黑", "妖精", new String[]{"空间系-传送", "空间系-领域"}),
new Character(2, "罗小白", "人类", null)
).collect(Collectors.toList()); /**
* 获取所有 Character
* @return All Characters
*/
@GetMapping()
public List<Character> getCharacters() {
return characters;
} /**
* 根据 id 获取 Character
* @param id Id of Character
* @return Character
*/
@GetMapping(path = "{id}")
public Character getCharacter(@PathVariable int id) {
return characters.stream()
.filter(character -> character.getId() == id)
.findAny()
.orElse(null);
} /**
* 更新 Character
* @param character Changed Character
* @return Updated Character
*/
@PutMapping()
public Character alterCharacter(@RequestBody Character character) {
AtomicBoolean found = new AtomicBoolean(false); characters.replaceAll(c -> {
if (c.getId() == character.getId()) {
found.set(true);
return character;
} else return c;
}); return found.get() ? character : null;
} /**
* 添加 Character
* @param character New Character
* @return Inserted Character
*/
@PostMapping()
public Character addCharacter(@RequestBody Character character) {
return characters.add(character) ? character : null;
} /**
* 删除 Character
* @param id Id of Character
* @return Id of Character deleted
*/
@DeleteMapping(path = "{id}")
public int deleteCharacter(@PathVariable int id) {
return characters.removeIf(character -> character.getId() == id) ? id : -1;
}
}

3. 运行项目,访问 API

URL 方法 操作
/character GET 获取所有的 Character
/character/id GET 获取指定 id 的 Character
/character PUT 修改 Character,传递修改后的完整对象
/character/id DELETE 删除指定 id 的 Character

如果使用 ?id=xxx 的方式,可以将注解中的 path 参数去掉。

发送 GET 请求到 http://localhost:8080/character :

[
{
"id": 1,
"name": "罗小黑",
"racial": "妖精",
"ability": [
"空间系-传送",
"空间系-领域"
]
},
{
"id": 2,
"name": "罗小白",
"racial": "人类",
"ability": null
}
]

发送 GET 请求到 http://localhost:8080/character/1 :

{
"id": 1,
"name": "罗小黑",
"racial": "妖精",
"ability": [
"空间系-传送",
"空间系-领域"
]
}

DELETE 请求与上面的 GET 一样,成功后指定 id 的 Character 将被删除,返回删除的 id。

发送 PUT 请求到 ``http://localhost:8080/character,向 Header 添加 Content-Type:application/json`,Body 部分为 修改后的完整数据:

{
"id": 1,
"name": "小黑",
"racial": "妖精",
"ability": [
"空间系-传送"
]
}

成功后将返回与上面一样的 JSON 数据。

POST 请求与前面的 PUT 一样,成功后返回提交的数据。

使用 Spring Boot 构建 RESTful API的更多相关文章

  1. Spring Boot构建RESTful API与单元测试

    如果您对Spring MVC不熟悉并且还没有尝试过快速入门案例,建议先看一下相关的内容. @Controller:修饰class,用来创建处理http请求的对象 @RestController:Spr ...

  2. Spring Boot构建RESTful API

    @Controller:修饰class,用来创建处理http请求的对象 @RestController:Spring4之后加入的注解,原来在@Controller中返回json需要@ResponseB ...

  3. Spring Boot构建 RESTful 风格应用

    Spring Boot构建 RESTful 风格应用 1.Spring Boot构建 RESTful 风格应用 1.1 实战 1.1.1 创建工程 1.1.2 构建实体类 1.1.4 查询定制 1.1 ...

  4. Spring Boot2 系列教程(三十一)Spring Boot 构建 RESTful 风格应用

    RESTful ,到现在相信已经没人不知道这个东西了吧!关于 RESTful 的概念,我这里就不做过多介绍了,传统的 Struts 对 RESTful 支持不够友好 ,但是 SpringMVC 对于 ...

  5. 基于Spring Boot的RESTful API实践(一)

    1. RESTful简述    REST是一种设计风格,是一组约束条件及原则,而遵循REST风格的架构就称为RESTful架构,资源是RESTful的核心,一个好的RESTful架构,通过URL就能很 ...

  6. Spring Boot中Restful Api的异常统一处理

    我们在用Spring Boot去向前端提供Restful Api接口时,经常会遇到接口处理异常的情况,产生异常的可能原因是参数错误,空指针异常,SQL执行错误等等. 当发生这些异常时,Spring B ...

  7. spring boot构建restful服务

    使用spring boot快速构建出restful服务 JPA实现REST 创建spring boot项目,在项目文件pom.xml中添加以下依赖: <dependency> <gr ...

  8. 通过spring boot提供restful api

    1 将返回设置为produces = "application/json" 返回给客户端json格式的response. 2 对各种异常的处理 各种异常如何返回给客户端? 各种异常 ...

  9. Spring Boot 入门系列(二十二)使用Swagger2构建 RESTful API文档

    前面介绍了如何Spring Boot 快速打造Restful API 接口,也介绍了如何优雅的实现 Api 版本控制,不清楚的可以看我之前的文章:https://www.cnblogs.com/zha ...

随机推荐

  1. Ubuntu16.04的搭建l.2.t.p.d(宿舍访问公司内网)

    主要的实现步骤 openswan(ipsec) : 提供一个密钥 ppp :提供用户名和密码 xl2tpd : 提供L2TP服务 sysctl : 提供服务器内部转发 iptables : 提供请求从 ...

  2. 4.InfluxDB-InfluxQL基础语法教程--基本select语句

    本文翻译自官网,官网地址:(https://docs.influxdata.com/influxdb/v1.7/query_language/data_exploration/) 基本语法如下: SE ...

  3. mysql数据库之忘记root密码

    1.  vi /etc/my.cnf,在[mysqld]中添加 skip-grant-tables 例如: [mysqld] skip-grant-tables datadir=/var/lib/my ...

  4. Jenkins连接Git仓库时候报错Permission denied, please try again.

    一.连接GIT仓库报错 Failed to connect to repository : Command : stdout: stderr: Permission denied, please tr ...

  5. Spark之RDD

    Spark学习之路Spark之RDD 目录 一.RDD的概述 1.1 什么是RDD? RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数 ...

  6. COSO企业风险管理框架及其在大宗商品行业的应用

    https://mp.weixin.qq.com/s/P1NDvqsz0GNObm1pb47mfg 中国期货市场交易量领先全球,期权.互换等新的衍生品工具逐步引入,场外衍生品服务商正在涌现.越来越多的 ...

  7. SSH使用ProxyCommand通过代理服务器远程连接其他服务器

    当前环境拓扑图:   用户管理海外服务器,通过公网SSH远程时,由于网络质量原因公网丢包严重,这就导致管理员在对海外云主机进行管理时体验较差,表现形式可能是由于公网丢包严重执行命令卡顿,或者SSH进程 ...

  8. TensorFlow.js入门:一维向量的学习

    转载自:https://blog.csdn.net/weixin_34061042/article/details/89700664 一维向量及其运算 tensor 是 TensorFlow.js 的 ...

  9. $O(k^2)$ 求前缀 $k$ 次幂和(与长度无关)

    接下来求解前缀幂次和 求解 \(\sum_{i = 1}^{k} i^k\) \[ \begin{aligned} (p+1)^k - 1 = (p+1)^k - p^k + p^k - (p-1)^ ...

  10. Codeforces Round #507 (Div. 2, based on Olympiad of Metropolises) D mt19937

    https://codeforces.com/contest/1040/problem/D 用法 mt19937 g(种子); //种子:time(0) mt19937_64 g(); //long ...