Desde la entrada hasta la competencia en RESTful, basta con leer este artículo

requisitos de aprendizaje

Buena base java, familiarizado con el marco SpringBoot, familiarizado con el marco SpringMVC

objetivos de enseñanza

Dominar el diseño de interfaz RESTful

videotutorial

5 horas para llevarlo desde que comienza a dominar el diseño de interfaz RESTful

lecho

Permítanme explicar primero que este tutorial no es académico y no se enfoca en la investigación y discusión teóricas, sino que solo enseña desde una perspectiva práctica. Antes de hablar de RESTful, hagamos tres presagios: 1> API 2> Historia del desarrollo WEB 3> Separación de front-end y back-end

¿Qué es una API?

API (interfaz de programación de aplicaciones, interfaz de programación de aplicaciones ) son algunas funciones predefinidas , o se refiere al acuerdo de diferentes componentes del sistema de software. [1] El propósito es proporcionar a las aplicaciones y a los desarrolladores la capacidad de acceder a un conjunto de rutinas basadas en una pieza de software o hardware sin tener que acceder al código fuente o comprender los detalles del funcionamiento interno .

El desarrollador A ha desarrollado el software A y el desarrollador B está desarrollando el software B.

Un día, el desarrollador B quiere usar algunas funciones del software A, pero no quiere pasar por el código fuente y el proceso de realización de funciones del software A desde el principio, ¿qué debe hacer?

El desarrollador A pensó en una buena idea: empaqueté las funciones que necesita en el software A; si coloca este paquete en el software B, ¡puede usar mi método directamente!

Entre ellos, API es el método que dijo el desarrollador A.

Etapas del desarrollo web.

El desarrollo de la tecnología de desarrollo web se puede dividir aproximadamente en las siguientes etapas

Fase de contenido estático : en esta fase inicial, la Web es utilizada principalmente por instituciones de investigación. La Web consta de un gran número de documentos HTML estáticos.

Fase del programa CGI : en esta fase, el servidor web agrega algunas API de programación. Las aplicaciones escritas a través de estas API pueden proporcionar contenido que cambia dinámicamente a los clientes. .

Etapa de lenguaje de secuencias de comandos : en esta etapa, las tecnologías de lenguaje de secuencias de comandos que admiten sesiones, como ASP, PHP, JSP y ColdFusion, aparecen en el lado del servidor, y tecnologías como Java Applet y JavaScript aparecen en el lado del navegador. Usando estas técnicas, se puede proporcionar un contenido más rico y dinámico.

Etapa de aplicación de cliente ligero : en esta etapa, aparece en el lado del servidor un servidor de aplicaciones independiente del servidor web. Al mismo tiempo, apareció el modelo de desarrollo Web MVC y varios marcos de desarrollo Web MVC se hicieron gradualmente populares y ocuparon una posición dominante. Las aplicaciones web desarrolladas en base a estos marcos suelen ser aplicaciones de cliente ligero porque generan todo el contenido dinámico en el lado del servidor.

Etapa de aplicación RIA : en esta etapa, surgieron una variedad de tecnologías RIA (Rich Internet Application), que mejoraron en gran medida la experiencia del usuario de las aplicaciones web. La tecnología RIA más utilizada es DHTML+Ajax. La tecnología Ajax admite la actualización dinámica de contenido parcial en una página sin actualizar la página. Al mismo tiempo, nació una gran cantidad de bibliotecas de desarrollo DHTML front-end web, como Prototype, Dojo, ExtJS, jQuery/jQuery UI, etc.

Etapa de aplicaciones web móviles : en esta etapa han surgido una gran cantidad de tecnologías de desarrollo de aplicaciones web para dispositivos móviles. Además de las tecnologías de desarrollo nativas de plataformas de sistemas operativos como Android, iOS y Windows Phone, las tecnologías de desarrollo basadas en HTML5 también se han vuelto muy populares.

Separación tradicional VS front-end y back-end

modelo de desarrollo tradicional

El front-end escribe la página html estática en el desarrollo de back-end, el back-end cambia el html en una plantilla y luego usa el motor de plantillas para configurar la plantilla, como jsp, freemarker y otro personal de back-end. Si hay un problema con la página durante el proceso de desarrollo, debe devolverse. El front-end se modifica y el front-end se entrega al back-end hasta que se realice la función.

Problema: Extremos delantero y trasero severamente acoplados

1. Cuando el front-end necesita modificar errores y depurar, es necesario instalar un conjunto completo de herramientas de desarrollo de back-end en la computadora actual e iniciar el programa de back-end.

2. También se requiere que el personal de back-end conozca lenguajes de front-end como html y js.

3. La página de inicio también incrustará una gran cantidad de código de back-end

4. Una vez que el backend se cambia a un idioma, también se debe volver a desarrollar el frontend

5. Los costos de comunicación, los costos de depuración, el progreso del desarrollo de front-end y back-end se afectan entre sí, lo que reduce en gran medida la eficiencia del desarrollo.

Separación de los extremos delantero y trasero.

La separación de front-end y back-end no es solo un modo de desarrollo, sino también un modo arquitectónico de aplicaciones web. En la etapa de desarrollo, el personal de front-end y back-end acuerda la interfaz de interacción de datos y luego pueden desarrollar y probar en paralelo.

Una vez que se completa el desarrollo del front-end, las pruebas simuladas se pueden realizar de forma independiente, y el back-end también se puede probar utilizando herramientas de prueba de interfaz como postman. Finalmente, se puede llevar a cabo la prueba de depuración conjunta de funciones.

ventaja:

1. Las responsabilidades de front-end y back-end son claras, el back-end se enfoca en los datos y el front-end se enfoca en la visión.

2. No hay necesidad de esperar hasta el final del trabajo de desarrollo de la otra parte para mejorar la eficiencia del desarrollo.

3. Puede hacer frente a requisitos front-end complejos y cambiantes.

4. Mejorar la capacidad de mantenimiento del código

Diseño de interfaz RESTful

razón de la existencia

Con la aparición de la etapa web 2.0, el cliente no se limitará a los navegadores de PC, puede ser una aplicación móvil o un pequeño programa, que requiere que el servidor proporcione una interfaz API unificada, y diferentes tipos de clientes se basan en el mismo protocolo/Reglas puede llamar a la interfaz API y obtener los datos esperados.

En este punto, el núcleo: ¿cómo diseñar un conjunto de interfaz API científica?

Diferentes desarrolladores tienen diferentes hábitos de diseño para las interfaces API, por ejemplo, esto puede suceder

新增员工:
http://localhost/employee/save
http://localhost/employee/add
http://localhost/employee/new
http://localhost/employee/xinzeng
http://localhost/employee/append
http://localhost/employee?cmd=add

而且发送的请求方式以及响应结果也比较可能随意 

Respuesta: interfaz API con estilo RESTful

estilo REPOSO

REST es una regla (estilo) para el diseño de interfaces API, muy popular en proyectos web debido a su simplicidad, legibilidad y facilidad de uso. Al diseñar una interfaz, una aplicación o diseño que satisface las restricciones y los principios de REST se denomina aplicación RESTful.

reglas vinculantes

Mirando hacia atrás, el diseño de la interfaz web tradicional (método de asignación de solicitudes) debe considerar varios puntos.

Tome la lista de empleados como ejemplo.

@Controller
public class EmployeeController {
    @RequestMapping("/employee/list")
    public String list(Model model){
        model.addAttribute("list", employeeService.list())
        return "employee/list";
    }
}

diseño de interfaz tradicional

Al diseñar interfaces web tradicionales, considere:

1> Solicitar ruta

Generalmente, se adopta el método de ver el nombre y saber el significado, como: /empleado/lista

2> Método de solicitud

No importa, la anotación @RequestMapping puede aceptar cualquier método de solicitud, incluido: GET POST

3> Solicitar parámetros

No fijo, depende de la función de la interfaz, se puede decir que está determinado por la demanda

4> Solicitud de respuesta

No es fijo, depende de los requisitos, puede ser en formato Json o una plantilla de página.

Diseño de interfaz RESTful

Tome la lista de empleados como ejemplo.

@Controller
public class EmployeeController {
    @RequestMapping(value = "/employees", method = RequestMethod.GET)
	@ResponseBody
    public List<Employee> list(){
        return employeeService.list();
    }
}

1> Solicitar ruta

Ya no es una forma de saber el nombre, sino que está determinado por el recurso de la operación, generalmente se utiliza la forma plural del nombre del recurso.

Por ejemplo, el objeto de operación de la interfaz (recurso) es un empleado y la ruta se puede diseñar como: /empleados

La pregunta es, ¿qué son los recursos?

todo es un recurso

A los ojos de RESTful, todo en Internet es un recurso, y cada recurso tiene un localizador de recursos único (URI).

Una imagen es un recurso: https://c-ssl.duitang.com/uploads/item/201810/17/20181017111458_dqioq.jpg

Una página web es un recurso: Baidu, lo sabrás

Una ruta de solicitud es un recurso: http://localhost:8080/employee?id=1

Volviendo al código, la url http://localhost:8080/employee?id=1 significa consultar la información del empleado con id=1 en la base de datos. Esta información del empleado es el recurso descrito en Restful. Generalmente, no solo hay un recurso, como un empleado No solo los datos con id=1, la mayoría de ellos están en plural, por lo que el acuerdo RESTful: para que la interfaz opere recursos, use plural de manera unificada.

@RequestMapping("/employees")
public class EmployeeController{

}

Eche un vistazo a los siguientes ejemplos:
recurso del departamento
http://www.langfeiyes.cn/depts 
recurso del zoológico
https://api.example.com/v1/zoos
recurso de animales
https://api.example.com/v1/ criador de animales
Recurso
https://api.example.com/v1/employees

Mire la interfaz relajante escrita por otros Jiguang IM - API REST - Documentación de Jiguang

El resumen vernáculo final: diseño de interfaz RESTful: el camino generalmente es operar la pluralidad de objetos de entidad

2> Método de solicitud

El método de diseño de interfaz tradicional, utilizando la ruta de diseño de conocer el nombre y el significado, puede ver el funcionamiento de la interfaz en el recurso desde la ruta, pero la interfaz de estilo RESTful utiliza la cantidad plural de recursos como ruta, por lo que es imposible para ver el funcionamiento de la interfaz en el recurso desde la ruta, entonces, ¿qué debo hacer?

El estilo RESTful hace un escándalo por el método de solicitud HTTP y está de acuerdo:

OBTENER (SELECCIONAR): Obtenga un recurso (uno o más elementos) del servidor.

POST (CREATE): Crea un nuevo recurso en el servidor.

PUT (UPDATE): Actualiza el recurso en el servidor (el cliente proporciona el recurso completo después del cambio). PUT actualiza todo el objeto

PARCHE (ACTUALIZAR): recurso de actualización en el servidor (el cliente proporciona atributos modificados [parche]). PARCHE para actualizar atributos individuales

DELETE (DELETE): Elimina un recurso del servidor.

//aprender

HEAD: Obtener los metadatos de un recurso, como el valor hash o la fecha de última modificación de un recurso; OPCIONES: Obtener las operaciones que el cliente puede realizar sobre un recurso; (obtener la api del recurso (la descripción de qué operaciones puede realizarse en el recurso))

La ruta tradicional ve el nombre y el significado = ruta RESTful + método de solicitud

ejemplo

Forma tradicional:

http://www.langfeiyes.cn/employee/list

http://www.langfeiyes.cn/employee/get?id=1

http://www.langfeiyes.cn/employee/save?name=xx

http://www.langfeiyes.cn/employee/update?id=1&name=xx

http://www.langfeiyes.cn/employee/delete?id=1

manera REPOSA:

http://www.langfeiyes.cn/employees 
Agregar: POST 
Actualizar: PUT 
Eliminar: ELIMINAR 
Consulta: GET

GET /zoos: muestra todos los zoológicos 
POST /zoos: crea un nuevo zoológico 
GET /zoos/{id}: obtiene la información de un zoológico específico 
PUT /zoos/{id}: actualiza la información de un zoológico específico (proporciona la información de el zoológico Toda la información) 
PATCH /zoos/{id}: actualiza la información de un zoológico específico (proporciona información sobre el zoológico) 
DELETE /zoos/{id}: elimina un zoológico 
GET /zoos/{id}/animals: lista Todos los animales en un zoológico dado

Obtener todos los empleados en un departamento

GET /employee/getByDeptId solía ser más informal

GET /departamentos/{id}/empleados descansados风格

3> Solicitar parámetros

No fijo, depende de la función de la interfaz, se puede decir que está determinado por la demanda

4> Solicitud de respuesta

​RESTful
ha llegado a un acuerdo detallado sobre el valor de respuesta:

GET /colección: devuelve una lista (matriz) de objetos de recursos 
GET /colección/recurso: devuelve un objeto de recurso único 
POST /colección: devuelve un objeto de recurso recién generado 
PUT /colección/recurso: devuelve un objeto de recurso completo 
PATCH /colección/recurso : devuelve el objeto de recurso completo 
ELIMINAR /colección/recurso: devuelve un documento vacío

Los retornos de datos anteriores están todos en formato Json.

El desarrollo real y los datos de respuesta específicos se basan principalmente en las regulaciones/necesidades operativas de la empresa.

Expansión relacionada

Código de estado de respuesta HTTP

200 OK - [GET]: El servidor devolvió con éxito los datos solicitados por el usuario.

201 CREADO - [POST/PUT/PATCH]: el usuario creó o modificó correctamente los datos.

202 Aceptado - [ ]: indica que una solicitud se ha puesto en cola en segundo plano (tarea asíncrona)

204 SIN CONTENIDO - [ELIMINAR]: el usuario elimina los datos correctamente.

400 SOLICITUD NO VÁLIDA - [POST/PUT/PATCH]: Hay un error en la solicitud enviada por el usuario, y el servidor no creó ni modificó datos, esta operación es idempotente.

401 No autorizado - [ ]: Indica que el usuario no tiene permiso (error de token, nombre de usuario, contraseña).

403 Prohibido: [ ] indica que el usuario está autorizado (a diferencia de un error 401), pero el acceso está prohibido.

404 NO ENCONTRADO - [ ]: La solicitud enviada por el usuario es para un registro que no existe, y el servidor no ha realizado ninguna operación, lo cual es idempotente.

406 No Aceptable - [GET]: El formato solicitado por el usuario no está disponible (por ejemplo, el usuario solicita el formato JSON, pero solo el formato XML).

410 Gone -[GET]: El recurso solicitado por el usuario se elimina de forma permanente y no se volverá a obtener.

422 Entidad no procesable: [POST/PUT/PATCH] Se produjo un error de validación al crear un objeto.

500 ERROR INTERNO DEL SERVIDOR - [*]: Ocurrió un error en el servidor y el usuario no podrá determinar si la solicitud fue exitosa.

representación de recursos

Por ejemplo, el texto se puede expresar en formato txt, formato HTML, formato XML, formato JSON o incluso formato binario; las imágenes se pueden expresar en formato JPG o PNG.

Su forma específica de expresión debe especificarse en la información del encabezado de la solicitud HTTP con los campos Aceptar y Tipo de contenido, y estos dos campos son la descripción de la "expresión".

aceptar: aplicación/json tipo de contenido: aplicación/json

La diferencia entre Aceptar y Tipo de contenido 1. Aceptar pertenece al encabezado de la solicitud y el Tipo de contenido pertenece al encabezado de la entidad. Los encabezados Http se dividen en encabezados generales, encabezados de solicitud, encabezados de respuesta y encabezados de entidad. La estructura del encabezado http del solicitante: encabezado general|encabezado de solicitud|encabezado de entidad La estructura del encabezado http del respondedor: encabezado general|encabezado de respuesta|encabezado de entidad

2.Aceptar representa el tipo de datos que el remitente (cliente) desea aceptar. Por ejemplo: Aceptar: aplicación/json; significa que el tipo de datos que el cliente quiere aceptar es tipo json, y el fondo devuelve datos json

Content-Type representa el tipo de datos de los datos de la entidad enviados por el remitente (cliente|servidor). Por ejemplo: Content-Type: application/json; significa que el formato de datos enviado por el remitente es json, y el fondo debe usar este formato para recibir los datos enviados por el front-end.

 

Precaución

REST es solo un estilo de diseño, no un estándar. Solo proporciona un conjunto de principios y restricciones de diseño, y la operación específica se combina con los requisitos de la empresa/requisitos del proyecto.

Marco RESTful

Los comunes son SpringMVC, jersey, play

Herramienta de prueba de API

cartero, insomnio

Práctica de interfaz RESTful

preparación del proyecto

1> Cree un proyecto Springboot estándar, utilizando el entorno web

confiar

 <!-- SpringBoot的依赖配置-->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.3</version>
    <relativePath/>
</parent>

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

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.20</version>
        <scope>provided</scope>
    </dependency>


</dependencies>

2> configurar aplicación.propiedades

server.port=80

3> Editar clase de entidad, clase de inicio, clase de controlador

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Employee {
    private Long id;
    private String name;
    private int age;
}

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

@Controller
public class EmployeeController {
}

diseño de interfaz

1. Obtener todos los empleados

/**
 * 需求: 查询所有员工数据
 * 1>请求路径:  确定资源: /employees
 * 2>请求方式: GET
 * 3>请求参数: 无
 * 4>请求响应:  List<Employee> Json格式
*/
@RequestMapping(value = "/employees", method = RequestMethod.GET)
@ResponseBody
public List<Employee> list(){
    return Arrays.asList(new Employee(1L, "dafei", 18),
                         new Employee(2L, "xiaofei", 17) );
}

prueba

URL:http://localhost:80/empleados

Método de solicitud: OBTENER

2. Agregar un empleado

/**
 * 需求: 添加一个员工信息
 * 1>请求路径:  确定资源: /employees
 * 2>请求方式: POST
 * 3>请求参数: 员工相关信息(属性)
 * 4>请求响应:  Employee  Json格式
*/
@RequestMapping(value = "/employees", method = RequestMethod.POST)
@ResponseBody
public Employee add(Employee employee){
    employee.setId(1L);  //假装添加到数据,新增id为1L
    return employee;
}

prueba

URL:http://localhost:80/empleados

Método de solicitud: POST

Parámetros: nombre, edad

3. Actualizar los datos de los empleados

/**
 * 需求: 更新一个员工信息
 * 1>请求路径:  确定资源: /employees
 * 2>请求方式: PUT
 * 3>请求参数: 员工相关信息(属性)
 * 4>请求响应:  Employee  Json格式
*/
@RequestMapping(value = "/employees", method = RequestMethod.PUT)
@ResponseBody
public Employee update(Employee employee){
    employee.setName(employee.getName() + "_update");
    return employee;
}

prueba

URL:http://localhost:80/empleados

Método de solicitud: PUT

Parámetros: id, nombre, edad

4. Eliminar un empleado

Requisitos, después de que la operación sea exitosa, se devolverá el indicador de estado de la operación y se requiere un objeto de encapsulación de estado personalizado adicional (valor de retorno unificado)

@Setter
@Getter
public class JsonResult{

    private int code;  //状态码
    private String msg;//提示信息
    private Object data;//结果数据
    public JsonResult(int code, String msg, Object data){
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
    public static JsonResult success(){
        return new JsonResult(200, "操作成功", null);
    }
    public static JsonResult error(String msg){
        return new JsonResult(500, msg, null);
    }
}
/**
 * 需求: 删除一个员工信息
 * 1>请求路径:  确定资源: /employees
 * 2>请求方式: DELETE
 * 3>请求参数: id
 * 4>请求响应: 状态提示(成功/失败)
*/
@RequestMapping(value = "/employees", method = RequestMethod.DELETE)
@ResponseBody
public JsonResult delete(Long id){
    return JsonResult.success();
}

prueba

URL:http://localhost:80/empleados

Método de solicitud: ELIMINAR

Parámetro: identificación

5. Obtener información sobre un empleado

/**
 * 需求: 查询指定id的员工数据
 * 1>请求路径:  确定资源: /employees
 * 2>请求方式: GET
 * 3>请求参数: id
 * 4>请求响应:  Employee Json格式
 */
@RequestMapping(value = "/employees", method = RequestMethod.GET)
@ResponseBody
public Employee detail(Long id){
    return new Employee(id, "dafei", 18);
}

Cuando se inicia el proyecto, se informa un error directamente, diciendo que el mapeo de mapeo se repite

Analiza las razones


    /**
     *
     * 查询所有员工与查询某个员工, 使用路径: /employees   使用方法: GET  都相同
     * 此时在springmvc语法中,2个请求是不允许共存的。此时怎么办?
     *
     * 方案1:使用多级路径方式区分, 比如: /employees/detail
     * 方案2:参数路径的方式
     * 参数路径:请求映射接口中,将请求参数作为路径的一部分 
     *    比如:/employees/{id}      {id}  路径参数的占位符
     *    注意:客户发起请求时:
               url路径写法: http://localhost:8080/employees/1      其中 1 是路径参数
     *
     * 接口想要获取路径中参数,需要使用:@PathVariable 注解
     *   @PathVariable 作用:将url路径上参数解析并赋值到请求映射方法的形式参数
     *   注意: 如果路径参数的占位符跟请求映射方法的形式参数名不一致,需要使用注解属性明确指定
     *   "/employees/{eid}"    --->   @PathVariable("eid")
     *
     */

plano 1:

@RequestMapping(value = "/employees/detail", method = RequestMethod.GET)
@ResponseBody
public Employee detail(Long id){
    return new Employee(id, "dafei", 18);
}

prueba

URL: http://localhost:80/empleados/detalle

Método de solicitud: OBTENER

Parámetro: identificación

Escenario 2:

@RequestMapping(value = "/employees/{id}", method = RequestMethod.GET)
@ResponseBody
public Employee detail(@PathVariable Long id){
    return new Employee(id, "dafei", 18);
}

prueba

URL: http://localhost:80/empleados/1

Método de solicitud: ELIMINAR

expansión de ruta de parámetro 

interfaz de solicitud de página

Requisitos: hay 5 botones en la página, haga clic para iniciar una solicitud asíncrona y acceda a la interfaz tranquila correspondiente

1> importar jquery.js

2> Escribir página info.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/jquery/jquery.min.js"></script>

    <script>
        $(function () {
            $("#btn1").click(function () {
                $.get("/employees/1",function (data) {
                    console.log(data);
                })

            })

            $("#btn2").click(function () {
                $.get("/employees",function (data) {
                    console.log(data);
                })
            })

            $("#btn3").click(function () {

                $.post("/employees", {name:"dafei", age:18}, function (data) {
                    console.log(data);
                })


            })
            $("#btn4").click(function () {

                $.ajax({
                    url:"/employees",
                    type:"PUT",
                    data:{id:1, name:"dafei", age:18},
                    success:function (data) {
                        console.log(data);
                    }
                })

            })
            $("#btn5").click(function () {
                $.ajax({
                    url:"/employees",
                    type:"DELETE",
                    data:{id:1},
                    success:function (data) {
                        console.log(data);
                    }
                })
            })
        })
    </script>
</head>
<body>
<button id="btn1">查单个</button><br>
<button id="btn2">查所有</button><br>
<button id="btn3">添加</button><br>
<button id="btn4">更新</button><br>
<button id="btn5">删除</button><br>
</body>
</html>

3 > Accede, haz clic en el botón a su vez

Aviso

SpringMVC no admite el procesamiento de solicitudes de colocación de forma predeterminada, y es necesario configurar filtros para procesar solicitudes de colocación o parches

<filter>
	<filter-name>httpPutFormContentFilter</filter-name>
	<filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
</filter>

<filter-mapping>
	<filter-name>httpPutFormContentFilter</filter-name>
	<servlet-name>springMVC</servlet-name>
</filter-mapping>

Interfaz RESTful simplificada

@RestController

Compuesto por @Controller + @ResponseBody, pegado en la clase de controlador

@PathVariable

Los parámetros de marcador de posición en la URL se pueden vincular a los parámetros de entrada del método de procesamiento del controlador a través de @PathVariable

El marcador de posición {xxx} en la URL se puede vincular al parámetro de entrada del método de operación a través de @PathVariable ("xxx").

Pegar los parámetros del método de mapeo solicitados

@GetMapping se adjunta al método de asignación de solicitudes, que es equivalente a: @RequestMapping(method = RequestMethod.GET)

@PostMapeo

Pegado en el método de asignación de solicitudes, equivalente a: @RequestMapping(method = RequestMethod.POST)

@PutMapping

Pegue el método de asignación de solicitudes, equivalente a: @RequestMapping(method = RequestMethod.PUT)

@DeleteMapping

Pegue el método de asignación de solicitudes, equivalente a: @RequestMapping(method = RequestMethod.DELETE)

@RestController  //等价于:@ResponseBody + @Controller
@RequestMapping("employees")
public class EmployeeController {
    @GetMapping
    public List<Employee> list(){
        return Arrays.asList(new Employee(1L, "dafei", 18),
                new Employee(2L, "xiaofei", 17) );
    }
    @GetMapping("/{id}")
    public Employee detail(@PathVariable Long id){
        return new Employee(id, "dafei", 18);
    }
    @PostMapping
    public Employee add(Employee employee){
        employee.setId(1L);
        return employee;
    }
    @PutMapping
    public Employee update(Employee employee){
        employee.setName(employee.getName() + "_update");
        return employee;
    }
    @DeleteMapping
    public JsonResult delete(Long id){
        return JsonResult.success();
    }
}

Atributo de anotación RequestMapping

valor/ruta : ruta de mapeo; método : forma de limitar la solicitud, enumeración:

public enum RequestMethod {
    GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
}

params : limite los parámetros que se procesarán en la solicitud, solo las solicitudes que coincidan con los parámetros serán procesadas por este método;

/**
 * @RequestMapping(value = "/test", params = {"name"})  要求请求必须带上name参数
 * @RequestMapping(value = "/test", params = {"name=dafei"})  要求请求必须带上name参数,并且值为dafei
 */
@RequestMapping(value = "/test", params = {"name=dafei"})
@ResponseBody
public String test(){
}    

encabezados : limite la información del encabezado de la solicitud que se procesará. Solo las solicitudes que coincidan con el contenido del encabezado de la solicitud serán procesadas por este método;

@RequestMapping(value = "/test2", headers = {"accept=application/json"})
@ResponseBody
public String test2(){
    return "ok--json";
}

@RequestMapping(value = "/test2", headers = {"content-type=application/xml"})
@ResponseBody
public String test3(){
    return "ok--xml";
}

consume : limite la información del encabezado de la solicitud que se procesará y especifique claramente el tipo de parámetros que lleva el cliente

//等价于:@RequestMapping(value = "/test2", headers = {"content-type=application/json"})
@RequestMapping(value = "/test2", consumes = {"application/json"})
@ResponseBody
public String test4(){
    return "ok--json";
}

produce : limite la información del encabezado de la solicitud que se procesará y especifique claramente que el cliente espera que el servidor responda con el tipo de parámetro especificado

//等价于:@RequestMapping(value = "/test2", headers = {"accept=application/json"})
@RequestMapping(value = "/test2", produces = {"application/json"})
@ResponseBody
public String test5(){
    return "ok--json";
}

Resumir

El diseño de interfaz RESTful es tal cosa

1> Solicitar ruta

Determine el recurso de operación específico y combine los requisitos, puede agregar el prefijo y el sufijo de la ruta de manera adecuada, o usar el método de ruta de parámetro

2> Método de solicitud

De acuerdo con la función real de la interfaz, encuentre el método apropiado para el CRUD de recursos

Recursos desde cero: POST

Recurso de existencia a no existencia: ELIMINAR

Recurso del estado A al estado B: PUT

Estado del recurso sin cambios: GET

3> Solicitar parámetros

Según la función de la interfaz, los parámetros se pasan bajo demanda

4> Solicitud de respuesta

De acuerdo con la implementación de la interfaz y los requisitos de llamada del cliente, se determina el valor de retorno específico. Se recomienda utilizar el formato JSON.

Para resumir una oración: RESTful es un estilo de diseño de interfaz. Se recomienda que lo cumpla. Durante el desarrollo, debe manejarse de manera flexible en combinación con la situación real bajo la premisa de cumplimiento.

Tarea

Consultar a todos los empleados de un determinado departamento

/departamentos/{id}/empleados

Consultar la colección de todos los salarios de los empleados

/empleados/salarios

Consultar el salario de un empleado para un mes determinado

/empleados/{id}/salarios/{mes}

Operación de inicio de sesión de usuario

/usuarios/iniciar sesión --POST

Operación de cierre de sesión de usuario

/usuarios/cerrar sesión --ELIMINAR

Buscar por nombre de usuario

/usuarios/{nombre}

Buscar por edad

/usuarios/{edad}

Supongo que te gusta

Origin blog.csdn.net/langfeiyes/article/details/122871361
Recomendado
Clasificación