フロントエンドは POST リクエストを通じてデータを送信し、F12 を通じて特定のデータを表示することもできますが、バックエンド データは null として受信されます。
フロントエンドから送信されるデータはこんな感じ
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
}
})
開発者ツール F12NetWork インターフェイスを開き、リクエスト データを表示します。
リクエストは正常に送信され、データは正常です。データ送信タイプ:
JSON 形式で送信します。バックエンドのデータ受信ステータスを確認します。バックエンド
MVC のコントローラー構成を確認します。
@PostMapping("/books")
public void updateBook(Book book) throws Exception{
System.out.println(book);
bookService.updateBook(book);
}
もちろん、JSONデータの受信にはBookエンティティクラスを使用しますが、JSONデータはポストリクエストボディ(リクエストボディ)に配置されており、エンティティクラスで受信した場合は当然データは受信されません。
**解決策: **@RequestBody アノテーションを追加して、JSON データを JAVABean 型にカプセル化します。
@PostMapping("/books")
public void updateBook(@RequestBody Book book) throws Exception{
System.out.println(book);
bookService.updateBook(book);
}
このようにして、バックエンドはデータを受信できるようになります。
@RequestBody アノテーションを使用せずに、ポストリクエストのリクエストヘッダーのパラメータにデータを配置するとどうなるでしょうか?
PostMan ツールを開き、リクエスト ヘッダーにデータを入れます。
バックエンドはデータを受信しました:
この状況の概要:
1. POST リクエストのリクエスト本文にデータを入れます。バックエンドは @RequestBody アノテーションを使用して、 JAVABean型データをカプセル化します。
2. @RequestBody アノテーションを使用しない場合でも、リクエスト ヘッダーにパラメーターを入れると、データが自動的にカプセル化されます。
理由: Spring-MVC は、バックエンドの異なる Content-Type に応じて情報の変換と分析に異なる HttpMessageConverter 実装を採用します。データはリクエストボディに配置され、Content-Type タイプは application/json で、データはリクエストヘッダー. 、Content-Type タイプはapplication/x-www-form-urlencodedです。
Google ChromeもContent-Type
データの種類に応じてデベロッパーツール上でデータの表示が異なり、json型の場合はリクエストペイロード、フォームの場合はフォームデータが表示されます。
上記の状況の分析が終わったら、どのような状況で @RequestBody アノテーションを使用する必要があるのか、どのような状況で使用すべきでないのかを見てみましょう。
@ReqestBody アノテーション
1. 最初のケースは上記のケースで、フロントエンドによって送信されるデータ型は json データで、バックエンドは @RequestBody アノテーションを使用してデータを自動的にカプセル化します。
この場合注意が必要なのは、JAVABean型ではなくString型の場合、このアノテーションを使用すると、受け取ったjsonデータはString型に変換され、データ内容は次の形式の文字列になります。参照: PostMan を介した json の送信
データについては、最初にリクエスト ヘッダーを設定し、Content-Type タイプを application/json タイプに設定します。
リクエスト本文を送信して
、バックエンド データ (json 形式の文字列) を確認します。 .
このデータを使用したい場合は、抽出する必要があります。
まず対応するjarパッケージをインポートします
<!-- 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依赖架包下载 -->
データ抽出を実行する
@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;
}
明らかに面倒なので、この種のデータの URL にパラメーターを入れるには、引き続き get メソッドを使用します。
2. フロントエンドから送信されるデータ型はフォームデータ型であり、バックエンドでは @RequestBody アノテーションは使用されません。
ajax を使用して post リクエストを送信する場合、データはデフォルトで json タイプになります。フォームが post リクエストを設定してバックエンドに送信する場合、デフォルトは form-data タイプです。上記のデータはリクエストに配置されますこの場合、JAVABean 型であっても基本型であっても、バックエンドはデータを自動的にカプセル化します (もちろん、さらに多くのデータがある場合は、それをリクエストボディに含めた方がよいでしょう)。
参考記事:
1. Form-dataとRequest-Payload
2. RequestBodyの使い方
3. JSON型とString型の変換