赞
踩
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>
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; } }
package com.southwind.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;
@Data
@AllArgsConstructor
public class Employee {
private Long id;
private String name;
}
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; }
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);
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。