フロントエンドは POST リクエストを送信し、バックエンド データは null ソリューションとして受信されます。 @RequestBody アノテーションの詳細な使用方法。送信するデータの種類は content-type によって決まります。

フロントエンドは 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型の変換

おすすめ

転載: blog.csdn.net/qq_44660367/article/details/109200593