El front-end envía una solicitud POST, los datos del back-end se reciben como una solución nula, el uso detallado de la anotación @RequestBody, el tipo de contenido determina qué tipo de datos enviar

El front-end envía datos a través de la solicitud POST, y los datos específicos también se pueden ver a través de F12, pero los datos del back-end se reciben como nulos.

Los datos enviados por el front-end son así

this.$axios
          .post('/books', {
    
    
            id: this.form.id,
            cover: this.form.cover,
            title: this.form.title,
            author: this.form.author,
            date: this.form.date,
            press: this.form.press,
            abs: this.form.abs,
            cid: this.form.cid
          }).then(resp => {
    
    
          if (resp && resp.status === 200) {
    
    
            this.dialogFormVisible = false
          }
        })

Abra la interfaz de la herramienta de desarrollo F12NetWork para ver los datos de la solicitud.
inserte la descripción de la imagen aquí
La solicitud se envió correctamente y los datos están bien. El tipo de envío de datos:
inserte la descripción de la imagen aquí
enviar en formato JSON. Verifique el estado de recepción de datos del backend:
inserte la descripción de la imagen aquí
verifique la configuración del controlador de nuestro backend mvc

@PostMapping("/books")
    public void updateBook(Book book) throws Exception{
    
    
        System.out.println(book);
        bookService.updateBook(book);
    }

Obviamente, uso la clase de entidad Libro para recibir datos JSON. Los datos JSON se colocan en el cuerpo de la solicitud posterior (cuerpo de la solicitud) y, por supuesto, no recibiremos datos si los recibimos con la clase de entidad.
**Solución: **Agregue la anotación @RequestBody para encapsular los datos JSON en el tipo JAVABean

@PostMapping("/books")
    public void updateBook(@RequestBody Book book) throws Exception{
    
    
        System.out.println(book);
        bookService.updateBook(book);
    }

De esta forma, el backend puede recibir los datos.
inserte la descripción de la imagen aquí

Sin usar la anotación @RequestBody, ¿qué sucedería si los datos se colocan en los parámetros del encabezado de la solicitud con una solicitud posterior?
Abra la herramienta PostMan y coloque los datos en el encabezado de la solicitud.
inserte la descripción de la imagen aquí
El backend ha recibido los datos: Resumen
inserte la descripción de la imagen aquí
de esta situación : 1. Coloque los datos en el cuerpo de la solicitud con una solicitud POST, y el backend debe usar la anotación @RequestBody para encapsular los datos de tipo JAVABean. 2. Poner los parámetros en el encabezado de la solicitud encapsulará automáticamente los datos, incluso si no usa la anotación @RequestBody. Motivo : Spring-MVC adoptará diferentes implementaciones de HttpMessageConverter para la conversión y el análisis de información de acuerdo con diferentes tipos de contenido en el backend. Los datos se colocan en el cuerpo de la solicitud, el tipo de tipo de contenido es application/json y los datos se colocan en el encabezado de solicitud . , el tipo de tipo de contenido es application/x-www-form-urlencoded .


Google Chrome también Content-Typemostrará los datos de manera diferente en las herramientas para desarrolladores según el tipo de datos.Si es de tipo json, mostrará Request Payload, y si es de formulario, mostrará Form Data.

Una vez finalizado el análisis de la situación anterior, veamos qué situaciones deben usar la anotación @RequestBody y qué situaciones no deben usarse.

Anotación @ReqestBody

1. El primer caso es el anterior. El tipo de datos enviado por el front-end es json data, y el back-end usa la anotación @RequestBody para encapsular automáticamente los datos.

Para esta situación, debe prestarle atención. Si es del tipo String en lugar del tipo JAVABean, y se usa esta anotación, los datos json recibidos se convertirán al tipo String, y el contenido de los datos es una cadena en la forma de json. Consulte: Envío de json a través de
PostMan Para obtener datos, primero establezca el encabezado de la solicitud y establezca el tipo de tipo de contenido en tipo de aplicación/json.
inserte la descripción de la imagen aquí
Envíe el cuerpo de la solicitud
inserte la descripción de la imagen aquí
y mire los datos de back-end: una cadena en forma de json Tenemos
inserte la descripción de la imagen aquí
que extraer estos datos si queremos usarlos.
Primero importe el paquete jar correspondiente

<!-- JSONObject对象依赖的jar包 -->
        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.9.3</version>
        </dependency>
        <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
            <version>3.2.1</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>net.sf.ezmorph</groupId>
            <artifactId>ezmorph</artifactId>
            <version>1.0.6</version>
        </dependency>
        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.2.3</version>
            <classifier>jdk15</classifier><!-- 指定jdk版本 -->
        </dependency>
        <!-- Json依赖架包下载 -->

Realizar extracción de datos

@RequestMapping("/testJson")
    public String testJson3(@RequestBody String string) {
    
    
    	// 将string类型转换为json数据
        JSONObject json = JSONObject.fromObject(string);
        // 使用JSONObject类的get方法提取属性
        Object string1 = json.get("string");
        // 再转换为string类型
        String s = string1.toString();
        System.out.println("object:string1:"+string1);
        return string;
    }

Obviamente, es engorroso, por lo que todavía usamos el método get para poner parámetros en la URL para este tipo de datos.

2. El tipo de datos enviado por el front-end es el tipo de datos de formulario y la anotación @RequestBody no se usa en el back-end.

Cuando se usa ajax para enviar una solicitud de publicación, los datos están predeterminados en el tipo json. Si el formulario establece la solicitud de publicación y la envía al backend, el valor predeterminado es el tipo de datos del formulario. Los datos mencionados anteriormente se colocan en la solicitud. encabezado Este es el caso, y el backend encapsulará automáticamente los datos, ya sea de tipo JAVABean o de tipo básico, por supuesto, si hay más datos, es mejor ponerlos en el cuerpo de la solicitud.
inserte la descripción de la imagen aquí
Artículos de referencia:
1. Form-data y Request-Payload
2. Uso de RequestBody
3. Conversión entre tipos JSON y String

Supongo que te gusta

Origin blog.csdn.net/qq_44660367/article/details/109200593
Recomendado
Clasificación