Spring Boot 开发入门--- RESTful 接口的 Web服务

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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值