SpringMVC プロジェクトの実行時にクライアントから送信されたリクエストは構文的に正しくありませんでした。問題を解決するためのアイデアはありますか?

一般に、クライアントから送信されたリクエストは構文的に正しくありませんでした。どのような問題が発生する可能性がありますか?

SpringMVCでは、サーバーにHTTPリクエストを送信する際、リクエストされたデータがサーバー側で正しく解析できない場合、「エラー400:クライアントから送信されたリクエストは構文的に正しくありません。」というエラーが発生する場合があります。

このエラーは通常、次の状況で発生します。

  1. リクエストのパラメータがサーバー側の予期されるパラメータと一致しません: リクエストのパラメータがサーバー側の予期されるパラメータと一致しない場合 (パラメータのタイプが正しくない、パラメータが欠落しているなど)、サーバーは正しくリクエストを実行できません。リクエストを解析し、エラーをトリガーします。
  2. 不正なリクエスト本文の形式: リクエスト本文の形式がサーバーの予期される形式と一致しない場合、たとえば、送信されたデータがサーバーによって定義された JSON、XML、またはフォーム形式の要件を満たしていない場合、サーバーは次のことを行うことができません。リクエストを正しく解析します。
  3. 不正な文字が使用されている: リクエストにサポートされていない特殊文字または不正な文字が含まれている場合、サーバーはリクエストを正しく処理できません。
  4. サーバー構成の問題: 場合によっては、リクエスト サイズの制限など、サーバー構成に問題があることがこのエラーの原因となる場合があります。

この問題を解決するには、次の手順に従ってトラブルシューティングを行います。

  1. リクエストパラメータが、パラメータの名前、タイプ、数などを含め、サーバー側で予期されるパラメータと一致しているかどうかを確認します。
  2. JSON、XML、フォーム形式の要件を満たしているかなど、リクエストボディの形式が正しいかどうかを確認します。
  3. リクエストに有効な文字が含まれているかどうかを確認し、サポートされていない特殊文字や不正な文字の使用を避けてください。
  4. リクエストサイズの制限が適切に設定されているかなど、サーバーの構成に問題がないか確認してください。

上記のトラブルシューティング方法で問題を解決できない場合は、サーバー側の特定のエラー ログを確認して、問題を迅速に特定して解決するために役立つ詳細なエラー情報を取得できます。

私の質問を見てもらえますか

SpringMVCを使用して独自のプロジェクトを実行するときに、それを報告しました

HTTP ステータス 400 -

クライアントから送信されたリクエストは構文的に正しくありませんでした。

間違い

現時点では、多くの人が自分のエラー レポートを見つけて多くの情報を検索しますが、多くの情報を検索しても問題を解決できないことがよくあります。

私もたくさんの質問とたくさんの方法を探したので、非常に単純な質問を無視しました。

バックエンドメソッド

ファイルのアップロードを例に挙げていますが、もちろん方法は異なりますが、原理は同じです。

@RequestMapping(value = "/upload")
    public String upload(StrutsClas strutsClas, MultipartFile pic) {
        try {

//            本地保存地址
            String dir = PropertiesUtil.getValue("dir");
//            网络保存地址
            String server = PropertiesUtil.getValue("server");

//            文件名
            String filename = pic.getOriginalFilename();
            FileUtils.copyInputStreamToFile(pic.getInputStream(), new File(dir + filename));
            //2) 更新数据库表文件记录
            strutsClas.setPic(server + filename);
            strutsClasBiz.updateByPrimaryKeySelective(strutsClas);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "redirect:list";
    }

フロントエンドコード

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>图片上传</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/sc/upload" method="post" enctype="multipart/form-data">
    <label>班级编号:</label><input type="text" name="cid" readonly="readonly" value="${param.cid}"/><br/>
    <label>班级图片:</label><input type="file" name="pic"/><br/>
    <input type="submit" value="上传图片"/>
</form>
</body>
</html>

説明する

        私のメソッドのMultipartFileの名前はpicであり、フロントエンド コードフォームの<input>タグの属性名もpicであることがわかりますもちろんこれに問題はありませんが、問題はここにあります。誰もが確信しているでしょう、そんなことは影響がないはずだと思うかもしれませんが、実際には地球にも影響はありません

問題の説明

エンティティ クラスが        メソッドに渡されていることがわかります。実際、このエンティティ クラスの属性は、データベーステーブルの列名と1 対 1で対応しています

エンティティクラス

package com.tgq.model;

import lombok.ToString;

@ToString
public class StrutsClas {
    private Integer cid;

    private String cname;

    private String cteacher;

    private String pic;

    public StrutsClas(Integer cid, String cname, String cteacher, String pic) {
        this.cid = cid;
        this.cname = cname;
        this.cteacher = cteacher;
        this.pic = pic;
    }

    public StrutsClas() {
        super();
    }

    public Integer getCid() {
        return cid;
    }

    public void setCid(Integer cid) {
        this.cid = cid;
    }

    public String getCname() {
        return cname;
    }

    public void setCname(String cname) {
        this.cname = cname;
    }

    public String getCteacher() {
        return cteacher;
    }

    public void setCteacher(String cteacher) {
        this.cteacher = cteacher;
    }

    public String getPic() {
        return pic;
    }

    public void setPic(String pic) {
        this.pic = pic;
    }
}

私のパスの追加方法で大丈夫だと思う人もいるかもしれませんが、問題はこの明らかな場所にあります。

問題が解決しました

メソッド内のMultipartFileの名前はpicであり、フロントエンド コードフォームの<input>タグ内の属性名もpicであるため、この pic を変更するだけで済みます。

        ここでのMultipartFileの名前は、フロントエンドコードのフォーム形式の<input>タグ内の属性に書いた名前と同じにする必要があるため、エンティティクラスを渡しているため、同じ名前にすることはできません。エンティティクラスの属性名またはデータベースのカラム名が一致していなければ、このような問題が発生します。

変更されたコード

方法

@RequestMapping(value = "/upload")
    public String upload(StrutsClas strutsClas, MultipartFile zx) {
        try {
//            本地保存地址
            String dir = PropertiesUtil.getValue("dir");
//            网络保存地址/upload/
            String server = PropertiesUtil.getValue("server");
//            文件名
            String filename = zx.getOriginalFilename();
            FileUtils.copyInputStreamToFile(zx.getInputStream(), new File(dir + filename));
            //2) 更新数据库表文件记录
            strutsClas.setPic(server + filename);
            strutsClasBiz.updateByPrimaryKeySelective(strutsClas);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "redirect:list";
    }

フロントエンドコード

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>图片上传</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/sc/upload" method="post" enctype="multipart/form-data">
    <label>班级编号:</label><input type="text" name="cid" readonly="readonly" value="${param.cid}"/><br/>
    <label>班级图片:</label><input type="file" name="zx"/><br/>
    <input type="submit" value="上传图片"/>
</form>
</body>
</html>

試験結果

おすすめ

転載: blog.csdn.net/weixin_74383330/article/details/132865533