HTTP状态码
通过HTTP状态码体现动作的结果,不要自定义
200 OK
400 Bad Request
500 Internal Server Error
在 APP 与 API 的交互当中,其结果逃不出这三种状态:
- 所有事情都按预期正确执行完毕 - 成功
- APP 发生了一些错误 – 客户端错误(如:校验用户输入身份证,结果输入的是军官证,就是客户端输入错误)
- API 发生了一些错误 – 服务器端错误(各种编码bug或服务内部自己导致的异常)
这三种状态与上面的状态码是一一对应的。如果你觉得这三种状态,分类处理结果太宽泛,http-status code还有很多。建议还是要遵循KISS(Keep It Stupid and Simple)原则,上面的三种状态码完全可以覆盖99%以上的场景。这三个状态码大家都记得住,而且非常常用,多了就不一定了。
开发REST接口
1. 第一步:定义资源(对象)
@Data
@Builder
public class Article {
private Long id;
private String author;
private String title;
private String content;
private Date createTime;
private List<Reader> reader;
}
@Data
public class Reader {
private String name;
private Integer age;
}
Data、Builder都是lombok提供给我们的注解,有利于我们简化代码。可以参考本专栏之前章节对lombok进行学习。
- @Builder为我们提供了通过对象属性的链式赋值构建对象的方法,下文中代码会有详细介绍。
- @Data注解帮我们定义了一系列常用方法,如:getters、setters、hashcode、equals等
2.第二步:HTTP方法与Controller(动作)
我们实现一个简单的RESTful接口
- 增加一篇Article ,使用POST方法
- 删除一篇Article,使用DELETE方法,参数是id
- 更新一篇Article,使用PUT方法,以id为主键进行更新
- 获取一篇Article,使用GET方法
下面代码中并未真正的进行数据库操作,本专栏后面会讲解mybatis和JPA,届时会做补充。
@Slf4j
@RestController
@RequestMapping("/rest")
public class ArticleController {
//获取一篇Article,使用GET方法,根据id查询一篇文章
//@RequestMapping(value = "/articles/{id}",method = RequestMethod.GET)
@GetMapping("/articles/{id}")
public AjaxResponse getArticle(@PathVariable("id") Long id){
//使用lombok提供的builder构建对象
Article article = Article.builder()
.id(id)
.author("zimug")
.content("spring boot 从青铜到王者")
.createTime(new Date())
.title("t1").build();
log.info("article:" + article);
return AjaxResponse.success(article);
}
//增加一篇Article ,使用POST方法(RequestBody方式接收参数)
//@RequestMapping(value = "/articles",method = RequestMethod.POST)
@PostMapping("/articles")
public AjaxResponse saveArticle(@RequestBody Article article,
@RequestHeader String aaa){
//因为使用了lombok的Slf4j注解,这里可以直接使用log变量打印日志
log.info("saveArticle:" + article);
return AjaxResponse.success();
}
//增加一篇Article ,使用POST方法(RequestParam方式接收参数)
/*@PostMapping("/articles")
public AjaxResponse saveArticle(@RequestParam String author,
@RequestParam String title,
@RequestParam String content,
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@RequestParam Date createTime){
log.info("saveArticle:" + createTime);
return AjaxResponse.success();
}*/
//更新一篇Article,使用PUT方法,以id为主键进行更新
//@RequestMapping(value = "/articles",method = RequestMethod.PUT)
@PutMapping("/articles")
public AjaxResponse updateArticle(@RequestBody Article article){
if(article.getId() == null){
//article.id是必传参数,因为通常根据id去修改数据
//TODO 抛出一个自定义的异常
}
log.info("updateArticle:" + article);
return AjaxResponse.success();
}
//删除一篇Article,使用DELETE方法,参数是id
//@RequestMapping(value = "/articles/{id}",method = RequestMethod.DELETE)
@DeleteMapping("/articles/{id}")
public AjaxResponse deleteArticle(@PathVariable("id") Long id){
log.info("deleteArticle:" + id);
return AjaxResponse.success();
}
}
springboot web项目及postman简单测试
在idea中新建项目选择 spring lnitializr
next
选择springweb依赖项
finish...
创建如下package及class(计数web):
Count代码:
package com.example.demo.bean;
public class Count {
private int count;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
Controller代码:
package com.me.redis.resouce.controller;
import com.me.redis.resouce.bean.Count;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.me.redis.resouce.service.ResourceService;
@RestController
public class DemoceController {
@Autowired
ResourceService resourceService;
@RequestMapping(value = "/me/count", method = RequestMethod.PUT)
@ResponseBody
public void initCount(@RequestBody Count count){
resourceService.initCount(count);
}
@RequestMapping(value = "/me/count", method = RequestMethod.POST)
@ResponseBody
public void modifyCount(@RequestBody Count count){
resourceService.addCount(count);
}
@RequestMapping(value = "/me/count", method = RequestMethod.GET)
@ResponseBody
public Count getCount()
{
return resourceService.getCount();
}
}
Servise代码:
package com.example.web.service;
import com.example.web.bean.Count;
import com.example.web.manager.ResourceManager;
import org.springframework.stereotype.Service;
@Service
public class demoService {
public void addCount(Count count){
if (count != null){
demoManager.getInstance().addCount(count.getCount());
}
}
public void minusCount(Count count){
if (count != null) {
demoManager.getInstance().minusCount(count.getCount());
}
}
public Count getCount()
{
Count count = new Count();
count.setCount(democeManager.getInstance().getCount());
return count;
}
public void initCount(Count count){
if (count != null) {
demoManager.getInstance().initCount(count.getCount());
}
}
}
Maneger代码:
package com.example.web.manager;
public class demoManager {
private int count = 0;
private static demoManager instance = new demoManager();
private demoManager(){}
public static demoManager getInstance(){
return instance;
}
public synchronized void addCount(int i){
count = count + i;
}
public synchronized void minusCount(int i){
count = count -i;
}
public int getCount(){
return count;
}
public void initCount(int i){
count = i;
}
}
然后进行测试;打开postman + get 输入localhost:8080\count
put初始化
设置count值为12,返回get页面再次查看
post修改
post修改值为6,返回get
count值已经在12的基础上+6
再次返回post 值为-10
结果即是在18基础上-10
测试成功
参考:https://www.cnblogs.com/wuyizuokan/p/11117294.html