当前位置:   article > 正文

RESTful接口的理解

restful接口

REST(指的是一套理论)(Representational State Transfer)

RESTful(通过理论实现的应用)

网络上的一切东西皆资源。

所谓资源,就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本,一张图片,一首歌曲,一种服务,总之就是一个具体的存在。你可以用一个uri(统一资源定位符指向它),每种资源对应一个uri,要获取这个资源,访问它的uri就可以,因为uri就成了每一个资源的地址或独一无二的识别符。

URL 是 URI 的子集。任何东西,只要能够唯一地标识出来,都可以说这个标识是 URI 。如果这个标识是一个可获取到上述对象的路径,那么同时它也可以是一个 URL ;但如果这个标识不提供获取到对象的路径,那么它就必然不是 URL 。

我们的rest就是围绕的资源来实现的。

在这里插入图片描述
资源是一种信息实体,它可以有多种外在表现形式。我们把资源具体呈现出来的形式,就叫做它的表现层。
在这里插入图片描述总结:
1.资源以什么样的表现形式呈现出来,这个就叫它的表现层。
2.资源的表现层,一般都是在请求头信息中提现出来。

在这里插入图片描述访问一个网站,就代表了客户端和服务器的一个互动过程,在这个过程中,势必涉及到数据和状态的变化。

互联网通信协议HTTP协议,是一个无状态协议。这意味着,所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器发生状态转化,而这种转化是建立在表现层之上的,所以就是表现层状态转化。

在这里插入图片描述这里的手段指的就是客户端向服务器发送form表单或者ajax请求。

get用于查询,post用于新增,put用于修改,delete用户删除

在这里插入图片描述总结:
REST指的是一组架构约束条件和原则,满足这些约束条件和原则的应用程序或设计就是RESTful

1.每一个uri表示一种资源;
2.客户端和服务器之间,传递这种资源的某种表现层
3.客户端通过HTTP提供的统一接口,对服务器端资源进行操作,实现表现层状态转化。

在这里插入图片描述

在RESTful架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词,而且所用的名字往往与数据库的表名对应。一般来说,数据库中的表都是同种记录的集合,所以uri中的名词也应该使用复数。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述Accept:表示的是希望接收什么数据

在这里插入图片描述在这里插入图片描述
在这里插入图片描述设计restful接口步骤:
1.确定资源 /employees
2.确定请求方式 GET
3.确定返回结果(类型,头信息,状态码) 员工集合,content-type=application/json,200

在这里插入图片描述在这里插入图片描述报这个错的原因就是如果使用Controller这个注解的时候,它会再次去寻找控制层的路径。没有找到就会报错。

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
获取某个员工的信息

在这里插入图片描述
F9 resume programe 恢复程序
Alt+F10 show execution point 显示执行断点
F8 Step Over 相当于eclipse的f6 跳到下一步
F7 Step Into 相当于eclipse的f5就是 进入到代码
Alt+shift+F7 Force Step Into 这个是强制进入代码
Shift+F8 Step Out 相当于eclipse的f8跳到下一个断点,也相当于eclipse的f7跳出函数
Atl+F9 Run To Cursor 运行到光标处
ctrl+shift+F9 debug运行java类
ctrl+shift+F10 正常运行java类
alt+F8 debug时选中查看值

在这里插入图片描述在这里插入图片描述在这里插入图片描述
状态码是属于响应的东西
在这里插入图片描述 在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述路径占位符中的参数,可以自动封装到自定义对象的同名属性上。

在这里插入图片描述在这里插入图片描述出现(400,406,405)都可能是因为这个controller的问题
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述理解为该方法是一个消费者,用来消费前端传过来的数据。

在这里插入图片描述
@RequestBody就是用来接收员工对象的。

在这里插入图片描述form表单提交数据这里我们没写@PathVariable注解是因为我们这里写的是对象,会自动去实体类查找对应的属性。
后端如何接受前端传过来的Json数据
https://blog.csdn.net/weixin_43843164/article/details/106409546

在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

Json对象和Json字符串的区别:
参考文章:https://www.cnblogs.com/coprince/p/7727040.html

ajax请求data数据格式(传递json的方式)
参考文章:https://blog.csdn.net/jaryle/article/details/82937256

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>restfuldemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>


</project>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
package com.southwind.controller;

import com.southwind.entity.Employee;
import com.southwind.entity.Salary;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@RestController
public class EmployeeController {

//    @RequestMapping("employees")
    @RequestMapping(value = "employees",method = RequestMethod.GET)
    public List<Employee> list(){
        ArrayList<Employee> list=new ArrayList<>();
        list.add(new Employee(1L,"admin"));
        list.add(new Employee(2L,"小王"));
        return list;
    }
    /**
     * 获取某个员工的信息(路径传参的方式)
     * 1.确定资源  /employees/{}    这里的花括号叫做路径资源占位符,里面写的东西就是变量名称
     * 2.确定请求方式  GET
     * 3.确定返回结果(类型,头信息,状态码)  员工对象,content_type=application/json,200
     * 4.如果@PathVariable注解没有设置value默认就是去路径上找相同名称的参数
     */
    @GetMapping("employees/{id}")
    public Employee getById(@PathVariable Long id){
        return new Employee(id,"admin");
    }

    /**
     * 删除一个员工
     * 1.确定资源  /employees/{id}
     * 2.确定请求方式  DELETE
     * 3.确定返回结果(类型,头信息,状态码)  空文档,204
     */
    @DeleteMapping("employees/{id}")
    public void deleteById(@PathVariable Long id, HttpServletResponse response){
        System.out.println("删除id为:"+id+"的员工");
//        response.setStatus(204);
        response.setStatus(HttpServletResponse.SC_NO_CONTENT);
    }


    /**
     * 获取某个员工某个月的薪资记录
     * 1.确定资源  /employees/{employeeId}/salaryies/{month}
     * 2.确定请求方式
     * 3.确定返回结果(类型,头信息,状态码)  薪资对象,content-type=application/json,200
     */
    @GetMapping("/employees/{employeeId}/salaryies/{month}")
    public Salary getSalaryByEmployee(@PathVariable Long employId,
                                      @PathVariable @DateTimeFormat(pattern = "yy-MM") Date month){
        return new Salary(1L,employId, BigDecimal.TEN,month);
    }

    @PostMapping("employees/{employeeId}/salaries")
    public Salary save(Salary salary){
        return salary;
    }


}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
package com.southwind.entity;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;

@Data
@AllArgsConstructor
public class Employee {
    private Long id;
    private String name;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
package com.southwind.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.math.BigDecimal;
import java.util.Date;
@Data
@AllArgsConstructor
public class Salary {

    private Long id;
    private Long employeeId;
    private BigDecimal money;
    @JsonFormat(pattern = "yyyy-M",timezone = "GMT+8")  //因为我们位于东8区,不加8就少了8个小时
    @DateTimeFormat(pattern = "yyyy-MM")
    private Date date;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
package com.southwind;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/869832
推荐阅读
  

闽ICP备14008679号