欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Restful软件架构风格

程序员文章站 2024-03-24 10:20:52
...

Restful

概念

是软件的一种设计架构和设计风格,由http1.1开创者提出。rest中有一些约束条件和原则,符合这些约束的程序或设计就是restful

网络资源

  • 在网络中一切皆资源,都有唯一的uri(统一资源定位符)进行定位,uri只表示一种资源,但并不代表资源的表现形式。在restful中,uri中只能有名词,不能有动词,且与数据库表名对应,且使用复数
    旧方式
    http://localhost/employee/delete?id=1

restful方式

    //删除  注意提交方式是delete
    http://localhost/employees/1

    //查询所有  注意提交方式是get
    http://localhost/employees

    //查询id为1的员工  注意提交方式是get
    http://localhost/employees/1

    //新增  注意提交方式是post,需要提交参数
    http://localhost/employees

    //全部更新  注意提交方式是put,需要提供该员工的全部属性
    http://localhost/employees/1

    //局部更新  注意提交方式是patch,需要提供该员工的部分属性
    http://localhost/employees/1
  • 资源的表现形式在http请求头信息中
    accept: application/json 代表浏览器希望服务器返回的数据格式,与后台produce对应
    content-type: application/json 代表浏览器传给后台的数据格式,与后台consume对应

  • http1.1协议中的请求方法

  1. get
  2. post
  3. delete 删除时
  4. put 需要更新整个对象
  5. patch 对象中的部分属性更新
  6. head
  7. options

restful中常见状态码

  1. 200 ok [get] 通常是查询成功
  2. 201 created [post,put,patch] 通常用于新增或更改成功
  3. 204 no content [delete] 通常用于删除成功
  4. 400 invalid erquest 通常是浏览器发送的数据无法被controller转换接收,比如日期要指定pattern
  5. 405 Request method ‘xx’ not supported 后台要求的请求方法类型与前台传来的不一致

常用restful开发框架

主流SpringMVC,其余WebFlux,jersey,play

补充小bug:Springmvc返回json字符串时会出现中文乱码

  • postmapping中指定produces = “application/json;charset=utf-8”
  • 前端请求中指定Accept为application/json;charset=utf-8
  • 在mvc.xml中添加响应格式转换器,不止可以指定json,text/html格式一样可以指定
    <!--mvc注解解析器-->
    <mvc:annotation-driven>
        <!--json修改默认编码,否则中文乱码-->
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

在SpringMVC中使用restful

以前无论什么请求都是使用RequestMapping注解,现在要窄化请求,常用5种RequestMapping子注解

    //列举所有员工
    @GetMapping("/employees")

    //获取指定id的员工
    @GetMapping("/employees/{id}")

    //删除指定id的员工,删除通常返回状态码204
    @DeleteMapping("/employees/{id}")

    //新增员工
    @PostMapping(path = "/employees")

    //更新员工全部属性
    @PutMapping(path = "/employees")

    //更新员工部分属性
    @PatchMapping(path = "/employees")

这些如果用@RequestMapping替代的话

    @RequestMapping(path = "xx",method = RequestMethod.DELETE)

@RequestMapping注解的常用属性

  1. value/path 映射路径
  2. method 窄化请求,限定请求方式,只有对应的请求方式的请求才会被该方法处理
  3. headers 请求头中必须包含规定信息才能进入该方法
  4. params 请求中必须包含什么参数才会执行该方法,请求中的参数不仅要有而且非空
  5. consumes 消费,设置服务器接受的数据类型,与浏览器content-type一致,不是该类型无法进入
  6. produces 生产,设置服务器返回给浏览器的数据类型,与浏览器accept一致

在ajax使用restful

  • ajax默认不支持put和patch,因此web.xml需要配置HttpPutFormContentFilter过滤器

  • ajax中contentType用于设置请求数据类型,dataType用于期望服务器返回的数据类型

  • ajax发送纯json格式数据,需要注意不止要设置contentType: “application/json;charset=utf-8”,
    在传送的data中要传json字符串JSON.stringify({“id”:1,“name”:‘chenjin’}),这样后台就可以使用@RequestBody接收json数据

在表单中使用restful

  • 表单默认只支持post和get,因此web.xml配置HiddenHttpMethodFilter过滤器,然后设置隐藏域为真实的方法类型
    <input type="hidden" name="_method" value="put"/>

为什么使用restful

  1. 后台提供的所有都是资源,因此统一资源定位符中应该出现的是名词,不应该有动词,那么动作如何规定,前台限制发送请求方法的类型比如post,get,delete,put…
    后台每个方法需要对应相应的请求方法类型限制,比如@DeleteMapping

  2. 适用于前后端分离,可以返回正确的状态码