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.
La solicitud se envió correctamente y los datos están bien. El tipo de envío de datos:
enviar en formato JSON. Verifique el estado de recepción de datos del backend:
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.
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.
El backend ha recibido los datos: Resumen
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-Type
mostrará 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.
Envíe el cuerpo de la solicitud
y mire los datos de back-end: una cadena en forma de json Tenemos
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.
Artículos de referencia:
1. Form-data y Request-Payload
2. Uso de RequestBody
3. Conversión entre tipos JSON y String