【SpringBoot】| Estilo de arquitetura de interface—RESTful

Índice 

1: Estilo de Arquitetura de Interface—RESTful

1. Entendendo o RESTful

2. Anotações RESTful


1: Estilo de Arquitetura de Interface—RESTful

1. Entendendo o RESTful

(1) Interface

① Interface: API (Application Programming Interface, interface de programação de aplicativo) são algumas interfaces predefinidas (como funções, interfaces HTTP) ou referem-se ao acordo de conexão de diferentes componentes do sistema de software . Um conjunto de rotinas que aplicativos e desenvolvedores podem acessar com base em um software ou hardware sem acessar o código-fonte ou entender os detalhes do funcionamento interno.

②Interface (API): Pode se referir ao acesso a servlets, urls de controladores e funções de chamada de outros programas.

(2) Estilo de arquitetura

Refere-se à forma como a API é organizada (como ela se parece), que é um estilo tradicional: http://localhost:9002/mytrans/addStudent?name=lisi&age=26

O nome do recurso de acesso addStudent é fornecido no endereço e, em seguida, o método get é usado para passar os parâmetros.

(3) estilo arquitetônico REST

REST: É um estilo arquitetônico de interface e um conceito de design, não um padrão. (Inglês: Representational State Transfer, Chinês: Representational State Transfer)

① Transição de estado da camada de apresentação:

Camada de apresentação: É a camada de visualização, que exibe os recursos, como jsp, etc., para exibir os resultados da operação dos recursos.

Status: indica uma alteração no recurso.

Transferência: os recursos podem ser alterados; os recursos podem ser criados (novo estado), os recursos podem ser consultados após a criação dos recursos (o conteúdo do recurso pode ser visto) e o conteúdo do recurso pode ser modificado (o recurso modificado é diferente do anterior).

②Elementos em REST: use REST para representar recursos e operações em recursos

Os recursos são representados por URLs e os recursos são representados por substantivos:

Na url, use substantivos para indicar recursos e informações sobre acesso a recursos. Na url, use "/" para separar informações sobre recursos, por exemplo: http://localhost:8080/myboot/student/1001

Consultar recursos: encontre recursos por url.

Criar recurso: adicione um recurso.

Atualizar recurso: atualizar recurso, editar.

Excluir recurso: remover.

Use a ação (modo de solicitação) em http para representar a operação nos recursos (CURD): 

GET: consulta de recursos ---> seleção de sql

Lidando com um único recurso: use sua forma singular

http://localhost:8080/myboot/student/1001

http://localhost:8080/myboot/student/1002

Manipulando vários recursos: use plurais

http://localhost:8080/myboot/students/1001/1002

POST: criar recurso ---> sql insert

http://localhost:8080/myboot/student

Passar dados na solicitação de postagem

<form action="http://localhost:8080/myboot/student" method="post">
	姓名:<input type="text" name="name" />
    年龄:<input type="text" name="age" />
</form>

PUT: recurso de atualização ---> atualização de sql

Os navegadores não podem suportar diretamente a colocação, então faça uma postagem primeiro; em seguida, use um campo oculto para transformar a solicitação de postagem em uma entrada real

<form action="http://localhost:8080/myboot/student/1" method="post">
	姓名:<input type="text" name="name" />
    年龄:<input type="text" name="age" />
    <input type="hidden" name="_method" value="PUT" />
</form>

DELETE: excluir recursos ---> sql delete

<a href="http://localhost:8080/myboot/student/1">删除1的数据</a>

Resumo: use url para representar recursos e use ações http para manipular recursos!

(4) Paginação

Se parâmetros como paginação e classificação forem necessários, eles ainda devem ser colocados após a url na forma de ?, por exemplo:

http://localhost:8080/myboot/students?page=1&pageSize=20

(5) Vantagens

① Leve: baseado diretamente em http, nenhum outro protocolo como mensagem é necessário.

②Recursos orientados: é claro e auto-explicativo.

③A descrição dos dados é simples: geralmente use xml e json para troca de dados.

④ Stateless: Ao chamar uma interface (acessando e operando recursos), você não precisa considerar o contexto ou o estado atual, o que reduz muito a complexidade.

⑤Acoplamento simples e baixo

2. Anotações RESTful

@PathVariable , usado para obter os dados na url ; esta anotação é a anotação mais importante para realizar RESTFul!

@GetMapping , recebe a requisição do método get , é equivalente a @RequestMapping( method=RequestMethod.GET).

@PostMapping , recebe e processa a requisição do modo Post ; é equivalente a @RequestMapping( method=RequestMethod.POST).

@PutMapping , recebe a requisição do método put , é equivalente a @RequestMapping( method=RequestMethod.PUT).

@DeleteMapping , para receber solicitações no modo de exclusão ; equivalente a @RequestMapping( method=RequestMethod.DELETE).

A anotação composta @RestController é uma combinação de @Controller e @ResponseBody ; usar @RestController na classe significa que todos os métodos da classe atual foram adicionados a @ResponseBody.

Caso: Uso conjunto da anotação @PathVariable e anotação @GetMapping (recursos de consulta)

① Use a anotação composta @RestController na classe para entregar a classe atual ao contêiner Spring para gerenciamento e adicione @ResponseBody a cada método na classe por padrão.

② Use a anotação GetMapping para enviar uma solicitação get. Sabemos que não há variáveis ​​no caminho de solicitação de estilo Restful, então você deve primeiro usar {nome da variável} para definir a variável de caminho e, em seguida, usar a anotação de variável de caminho @PathVariable para referenciar a variável de caminho ; por exemplo: queryStudent(@PathVariable (value = "stuId") Integer stuId) significa atribuir o valor passado da variável de caminho para a variável stuId.

package com.zl.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyRestController {

    @GetMapping("/student/{stuId}")
    public String queryStudent(@PathVariable(value = "stuId") Integer stuId){
        return "Studnet的id是:"+stuId;

    }
}

Resultados do:

De acordo com o valor passado pela url, ele é atribuído à variável path, e a variável path nos permite obter os dados e exibi-los através da anotação @PathVariable.

Caso: Uso conjunto da anotação @PathVariable e anotação @PostMapping (criando recursos)

página de formulário addStudent.html (pertencente a recursos estáticos colocados no diretório estático), transferir dados na solicitação post

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h3>添加学生</h3>
    <form action="student/zhangsan/18" method="post">
        <input type="submit" value="注册学生">
    </form>
</body>
</html>

receber dados

    // 创建资源
    @PostMapping("/student/{name}/{age}")
    public String createStudent(@PathVariable("name") String name,
                                @PathVariable("age") Integer age){
        return "创建资源Student"+name+"="+age;
    }

Resultados do:

Caso: É complicado escrever uma página de formulário para Postar, Colocar e Excluir, e o navegador não oferece suporte a solicitações de inserção e exclusão; você pode usar uma ferramenta Postman

Observação: quando o nome da variável de caminho for consistente com o nome do parâmetro formal, o valor em @PathVariable poderá ser omitido.

Ferramenta de teste Postman: pode testar solicitações get, post, put, delete e outras

    // 更新资源
    @PutMapping("/student/{id}/{age}")
    public String modifyStudent(@PathVariable Integer id,
                                @PathVariable Integer age){
        return "更新资源Student:"+id+"="+age;
    }


    // 删除资源
    @DeleteMapping("/student/{id}")
    public String removeStudentById(@PathVariable Integer id){
        return "删除资源Student:"+id;
    }

Resultado da execução: salve a gravação da página do formulário

Caso: Use o filtro HiddenHttpMethodFilter para converter a solicitação de postagem em colocar, excluir

No SpringMVC existe um filtro org.springframework.web.filter.HiddenHttpMethodFilter.

Função: Converte a requisição post em requisição put, delete.

Etapa 1: Em application.properties(yml): habilite o filtro HiddenHttpMethodFilter

A análise do código-fonte descobriu que este componente foi configurado por padrão no SpringBoot, mas está desativado por padrão. Para entrar em vigor, ele deve ser configurado manualmente para entrar em vigor.

package org.springframework.boot.autoconfigure.web.servlet;

public class WebMvcAutoConfiguration {
	@Bean
	@ConditionalOnMissingBean(HiddenHttpMethodFilter.class)
	@ConditionalOnProperty(prefix = "spring.mvc.hiddenmethod.filter", name = "enabled")
	public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {
		return new OrderedHiddenHttpMethodFilter();
	}
}

definido como verdadeiro

#启用过滤器
spring.mvc.hiddenmethod.filter.enabled=true

Etapa 2: na página de solicitação, envie uma solicitação de postagem; o tipo usa o campo oculto oculto, o parâmetro de nome é _method e o valor corresponde ao nosso método de solicitação real put, delete

A página do formulário realmente envia uma solicitação de colocação!

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="student/test" method="post" >
        <!--指定真正的请求方式-->
        <input type="hidden" name="_method" value="put">
        <input type="submit" value="测试" />
    </form>
</body>
</html>

Extensão: atualmente, o parâmetro _method também pode ser definido como um parâmetro personalizado

Por meio da análise anterior do código-fonte, se não houver um HiddenHttpMethodFilter personalizado, o contêiner nos ajudará a personalizar um no gerenciamento do contêiner. O parâmetro padrão usado neste momento é _method!

Para que você mesmo possa criar um HiddenHttpMethodFilter, chame o método setMethodParam para defini-lo você mesmo

package com.zl.config;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.HiddenHttpMethodFilter;
 
@Configuration(proxyBeanMethods = false)
public class MyConfig {
    // 自定义Filter,纳入容器管理
    @Bean
    public HiddenHttpMethodFilter hiddenHttpMethodFilter(){
        HiddenHttpMethodFilter methodFilter = new HiddenHttpMethodFilter();
        // 设置method参数为_m
        methodFilter.setMethodParam("_m");
        return methodFilter;
    }
 
}

Problema: conflito de caminho de solicitação

Por exemplo: as duas requisições a seguir utilizam requisições get, os nomes dos recursos são os mesmos, e os tipos de dados transportados também são os mesmos; acessamos diretamente: http://localhost:8081/student/1 ; neste momento, haverá haver conflitos de caminho, resultando em falha de acesso!

Solução: O caminho de design deve ser único, e o caminho uri e o método de solicitação devem ser únicos!

@GetMapping("/student/{id}") 
@GetMapping("/student/{age}")

Acho que você gosta

Origin blog.csdn.net/m0_61933976/article/details/129368624
Recomendado
Clasificación