最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot前后端接口對接常見錯誤小結(jié)

 更新時間:2022年01月18日 15:11:47   作者:JavaDog程序狗  
SpringBoot前后端接口對接工作時,經(jīng)常遇到請求500,400等問題,本文主要介紹了SpringBoot前后端接口對接常見錯誤小結(jié),感興趣的可以了解一下

前言

SpringBoot前后端接口對接工作時,經(jīng)常遇到請求500,400等問題,馬虎大意經(jīng)常導(dǎo)致時間浪費(fèi),為此總結(jié)了4個常見的復(fù)雜請求類型,以此為戒。

開始

1.實體嵌套List提交

??例子:提交一個老師的實體Teacher,老師管理著不同的學(xué)生,還要傳入學(xué)生實體List <Student>
?常見問題:提交異常,會報400錯誤
??正確前端代碼

<button onclick="f1();" class="btn btn-primary">f1提交測試</button>
<script src="https://code.jquery.com/jquery.js"></script>
<script>
  const students = [{
        name: "王小明",
        age: "15",
    },{
        name: "李小紅",
        age: "15",
    }]
    const teacher = {
        name: "張老師",
        age: "40",
        students:students
    }
    // 實體嵌套List提交
    function f1(){
        // 關(guān)鍵邏輯,需要轉(zhuǎn)化成JSON字符串
        let data = JSON.stringify(teacher)
        $.ajax({
            type : 'post',
            url : '/f1',
            data : data,
            contentType:'application/json',
            success : function(resData) {
                console.log("f1調(diào)用成功" + resData)
                alert("f1調(diào)用成功" + resData);
            },
        });
    }
</script>

 ??正確后臺接收

    /**
     * @Description 實體嵌套List提交
     * @param teacher
     * @Return java.lang.String
     */
    @PostMapping("/f1")
    @ResponseBody
    public String f1(@RequestBody Teacher teacher){
        return teacher.toString();
    }

2.普通文件上傳

??例子:普通input 文件上傳通過onchange事件進(jìn)行數(shù)據(jù)組裝后,提交后臺
?常見問題:提交后,后臺接收到的MultipartFile為空
??正確前端代碼

<input type="file" name="f2" id="f2" onchange="f2()" multiple="multiple"></input>
<script src="https://code.jquery.com/jquery.js"></script>
<script>
    // 文件上傳
    function f2(){
        let file = event.target.files[0];
        let formData = new FormData();
        formData.append('file', file);
        $.ajax({
            url: '/f2',
            type: 'post',
            contentType: false,  // ContentType設(shè)置成false
            processData: false, // 不需要讓瀏覽器對FormData進(jìn)行轉(zhuǎn)換
            data: formData
        }).done(function (resData) {
            console.log("f2調(diào)用成功:" + resData)
            alert("f2調(diào)用成功:" + resData)
        })
    }
</script>

??正確后臺接收

    /**
     * @Description 文件上傳
     * @param file
     * @Return java.lang.String
     */
    @PostMapping("/f2")
    @ResponseBody
    public String f2(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return "上傳失敗,請選擇文件";
        }
        String fileName = file.getOriginalFilename();
        return fileName;
    }

3.List提交

??例子:提交時,傳給后臺一個List
?常見問題:提交異常,會報400錯誤
??正確前端代碼

 <button onclick="f3();" class="btn btn-primary">f3提交測試</button>
<script src="https://code.jquery.com/jquery.js"></script>
<script>
    const teachers = [{
        name: "張老師",
        age: "40"
    },{
        name: "李老師",
        age: "35"
    }]
    // 直接提交List
    function f3(){
        // 關(guān)鍵邏輯,需要轉(zhuǎn)化成JSON字符串
        let data = JSON.stringify(teachers)
        $.ajax({
            type : 'post',
            url : '/f3',
            data : data,
            contentType:'application/json',
            success : function(resData) {
                console.log("f3調(diào)用成功" + resData)
                alert("f3調(diào)用成功" + resData);
            },
        });
    }
</script>

??正確后臺接收

    /**
     * @Description List實體上傳
     * @param teachers
     * @Return java.lang.String
     */
    @PostMapping("/f3")
    @ResponseBody
    public String f3(@RequestBody List<Teacher> teachers) {
        return teachers.toString();
    }

4.數(shù)組Array提交

例子??:提交時,傳給后臺一個Array
?常見問題:提交異常,會報500錯誤
??正確前端代碼

<button onclick="f4();" class="btn btn-primary">提交f4測試</button>
<script src="https://code.jquery.com/jquery.js"></script>
<script>
const array = [1,2,3,4]
// 直接提交數(shù)組
function f4(){
    $.ajax({
        type : 'post',
        url : '/f4',
        data : {
            array:array
        },
        dataType: 'json',
        success : function(resData) {
            console.log("f4調(diào)用成功" + resData)
            alert("f4調(diào)用成功" + resData);
        },
    });
}
</script>

??正確后臺接收

    /**
     * @Description 數(shù)組上傳
     * @param array
     * @Return java.lang.String
     */
    @PostMapping("/f4")
    @ResponseBody
    public int[] f4(@RequestParam(value = "array[]")int[] array) {
        return array;
    }

可視化代碼

前端

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <title>請求列表</title>
    <link rel="shortcut icon" href="/static/favicon.ico" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 引入 Bootstrap -->
    <link  rel="stylesheet">
</head>
<body>
<div class="container">
    <table class="table">
        <caption style="text-align: center;"> <h2>SpringBoot常見出錯請求</h2></caption>
        <thead>
        <tr>
            <th style="min-width: 40px">No</th>
            <th style="min-width: 140px">類型</th>
            <th style="min-width: 180px">描述</th>
            <th style="min-width: 100px">常見問題</th>
            <th>參數(shù)Data</th>
            <th>請求代碼</th>
            <th>后端代碼</th>
            <th>操作</th>
        </tr>
        </thead>
        <tbody>
        <tr class="active">
            <td>f1</td>
            <td>實體嵌套List提交</td>
            <td>
                <div>
                    適用于請求時,一個實體嵌套這一個list。</br>
                    舉例:提交一個老師的實體Teacher,老師管理著不同的學(xué)生,還要傳入學(xué)生實體List &lt;Student&gt;
                </div>
            </td>
            <td>提交異常,會報400錯誤</td>
            <td>
               <pre id="f1Text">
{
  "name": "張老師",
  "age": "40",
  "students": [
    {
      "name": "王小明",
      "age": "15"
    },
    {
      "name": "李小紅",
      "age": "15"
    }
  ]
}
               </pre>
            </td>
            <td>
                <pre id="f1Code">
 function f1(){
    // 關(guān)鍵邏輯,需要轉(zhuǎn)化成JSON字符串
    let data = JSON.stringify(teacher)
    $.ajax({
        type : 'post',
        url : '/f1',
        data : data,
        contentType:'application/json',
        success : function(resData) {
            console.log("f1調(diào)用成功" + resData)
            alert("f1調(diào)用成功" + resData);
        },
    });
}
                </pre>
            </td>
            <td>
                <pre id="f1Java">
@PostMapping("/f1")
@ResponseBody
public String f1(@RequestBody Teacher teacher){
    return teacher.toString();
}
                </pre>
            </td>
            <td>
                <button onclick="f1();" class="btn btn-primary">f1提交測試</button>
            </td>
        </tr>
        <tr class="success">
            <td>f2</td>
            <td>文件上傳</td>
            <td>適用于原生文件上傳,onchange后數(shù)據(jù)組裝</td>
            <td>提交時后臺接收的MultipartFile為空</td>
            <td>
                <pre id="f2Text">file: (binary)</pre>
            </td>
            <td>
                <pre id="f2Code">
function f2(){
    let file = event.target.files[0];
    let formData = new FormData();
    formData.append('file', file);
    $.ajax({
        url: '/f2',
        type: 'post',
        contentType: false,  // ContentType設(shè)置成false
        processData: false, // 不需要讓瀏覽器對FormData進(jìn)行轉(zhuǎn)換
        data: formData
    }).done(function (resData) {
        console.log("f2調(diào)用成功:" + resData)
        alert("f2調(diào)用成功:" + resData)
    })
}

                </pre>
            </td>
            <td>
                <pre id="f2Java">
@PostMapping("/f2")
@ResponseBody
public String f2(@RequestParam("file") MultipartFile file) {
    if (file.isEmpty()) {
        return "上傳失敗,請選擇文件";
    }
    String fileName = file.getOriginalFilename();
    return fileName;
}
                </pre>
            </td>
            <td>
                <input type="file" name="f2" id="f2" onchange="f2()" multiple="multiple"></input>
            </td>
        </tr>

        <tr class="active">
            <td>f3</td>
            <td>上傳List</td>
            <td>
                <div>
                    適用于請求時,直接傳一個List實體。</br>
                </div>
            </td>
            <td>提交異常,會報400錯誤</td>
            <td>
               <pre id="f3Text">
[{
    name: "張老師",
    age: "40"
},{
    name: "李老師",
    age: "35"
}]
               </pre>
            </td>
            <td>
                <pre id="f3Code">
 function f3(){
    // 關(guān)鍵邏輯,需要轉(zhuǎn)化成JSON字符串
    let data = JSON.stringify(teachers)
    $.ajax({
        type : 'post',
        url : '/f3',
        data : data,
        contentType:'application/json',
        success : function(resData) {
            console.log("f3調(diào)用成功" + resData)
            alert("f3調(diào)用成功" + resData);
        },
    });
}
                </pre>
            </td>
            <td>
                <pre id="f3Java">
@PostMapping("/f3")
@ResponseBody
public String f3(@RequestBody List&lt;Teacher&gt; teachers) {
    return teachers.toString();
}
                </pre>
            </td>
            <td>
                <button onclick="f3();" class="btn btn-primary">f3提交測試</button>
            </td>
        </tr>

        <tr class="success">
            <td>f4</td>
            <td>上傳數(shù)組Array</td>
            <td>適用于請求時,直接傳一個數(shù)組。</td>
            <td>提交異常,會報500錯誤</td>
            <td>
                <pre id="f4Text">[1,2,3,4]</pre>
            </td>
            <td>
                <pre id="f4Code">
function f4(){
    $.ajax({
        type : 'post',
        url : '/f4',
        data : {
            array:array
        },
        dataType: 'json',
        success : function(resData) {
            console.log("f4調(diào)用成功" + resData)
            alert("f4調(diào)用成功" + resData);
        },
    });
}
                </pre>
            </td>
            <td>
                <pre id="f4Java">
@PostMapping("/f4")
@ResponseBody
public int[] f4(@RequestParam(value = "array[]")int[] array) {
    return array;
}
                </pre>
            </td>
            <td>
                <button onclick="f4();" class="btn btn-primary">提交測試</button>
            </td>
        </tr>
        </tbody>
    </table>
</div>
<!-- jQuery (Bootstrap 的 JavaScript 插件需要引入 jQuery) -->
<script src="https://code.jquery.com/jquery.js"></script>
<script>
    const students = [{
        name: "王小明",
        age: "15",
    },{
        name: "李小紅",
        age: "15",
    }]
    const teacher = {
        name: "張老師",
        age: "40",
        students:students
    }
    // F1 Json數(shù)據(jù)格式化
    $('#f1Text').html(JsonFormat(teacher));

    // 實體嵌套List提交
    function f1(){
        // 關(guān)鍵邏輯,需要轉(zhuǎn)化成JSON字符串
        let data = JSON.stringify(teacher)
        $.ajax({
            type : 'post',
            url : '/f1',
            data : data,
            contentType:'application/json',
            success : function(resData) {
                console.log("f1調(diào)用成功" + resData)
                alert("f1調(diào)用成功" + resData);
            },
        });
    }
    // 文件上傳
    function f2(){
        let file = event.target.files[0];
        let formData = new FormData();
        formData.append('file', file);
        $.ajax({
            url: '/f2',
            type: 'post',
            contentType: false,  // ContentType設(shè)置成false
            processData: false, // 不需要讓瀏覽器對FormData進(jìn)行轉(zhuǎn)換
            data: formData
        }).done(function (resData) {
            console.log("f2調(diào)用成功:" + resData)
            alert("f2調(diào)用成功:" + resData)
        })
    }

    const teachers = [{
        name: "張老師",
        age: "40"
    },{
        name: "李老師",
        age: "35"
    }]
    // 直接提交List
    function f3(){
        // 關(guān)鍵邏輯,需要轉(zhuǎn)化成JSON字符串
        let data = JSON.stringify(teachers)
        $.ajax({
            type : 'post',
            url : '/f3',
            data : data,
            contentType:'application/json',
            success : function(resData) {
                console.log("f3調(diào)用成功" + resData)
                alert("f3調(diào)用成功" + resData);
            },
        });
    }
    const array = [1,2,3,4]
    // 直接提交數(shù)組
    function f4(){
        $.ajax({
            type : 'post',
            url : '/f4',
            data : {
                array:array
            },
            dataType: 'json',
            success : function(resData) {
                console.log("f4調(diào)用成功" + resData)
                alert("f4調(diào)用成功" + resData);
            },
        });
    }

    // Json格式化工具
    function JsonFormat(json) {
        if (typeof json != 'string') {
            json = JSON.stringify(json, undefined, 2);
        }
        json = json.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
        return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) {
            var cls = 'number';
            if (/^"/.test(match)) {
                if (/:$/.test(match)) {
                    cls = 'key';
                } else {
                    cls = 'string';
                }
            } else if (/true|false/.test(match)) {
                cls = 'boolean';
            } else if (/null/.test(match)) {
                cls = 'null';
            }
            return '<span class="' + cls + '">' + match + '</span>';
        });
    }
</script>
<style>
    pre {outline: 1px solid #ccc; padding: 5px; margin: 5px; }
    .string { color: green; }
    .number { color: darkorange; }
    .boolean { color: blue; }
    .null { color: magenta; }
    .key { color: red; }
    .container{
        width: 1900px;
    }
</style>
</body>
</html>

后端

package net.javadog.requestdemo.controller;

import net.javadog.requestdemo.entity.Teacher;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.List;

/**
 * 請求管理
 *
 * @author hdx
 * @version V1.0
 * @date 2021年10月18日
 */
@Controller
public class RequestController {
    @GetMapping("/request")
    public String request(){
        return "request/index";
    }

    /**
     * @Description 實體嵌套List提交
     * @param teacher
     * @Return java.lang.String
     */
    @PostMapping("/f1")
    @ResponseBody
    public String f1(@RequestBody Teacher teacher){
        return teacher.toString();
    }

    /**
     * @Description 文件上傳
     * @param file
     * @Return java.lang.String
     */
    @PostMapping("/f2")
    @ResponseBody
    public String f2(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return "上傳失敗,請選擇文件";
        }
        String fileName = file.getOriginalFilename();
        return fileName;
    }

    /**
     * @Description List實體上傳
     * @param teachers
     * @Return java.lang.String
     */
    @PostMapping("/f3")
    @ResponseBody
    public String f3(@RequestBody List<Teacher> teachers) {
        return teachers.toString();
    }

    /**
     * @Description 數(shù)組上傳
     * @param array
     * @Return java.lang.String
     */
    @PostMapping("/f4")
    @ResponseBody
    public int[] f4(@RequestParam(value = "array[]")int[] array) {
        return array;
    }
}

到此這篇關(guān)于SpringBoot前后端接口對接常見錯誤小結(jié)的文章就介紹到這了,更多相關(guān)SpringBoot前后端接口對接 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 2021最新IDEA的各種快捷鍵匯總

    2021最新IDEA的各種快捷鍵匯總

    掌握idea的各種快捷鍵,可以幫助我們開發(fā)程序,今天小編給大家?guī)韼追N比較常用的idea快捷鍵及一些快捷鍵介紹,對idea快捷鍵相關(guān)知識,感興趣的朋友一起看看吧
    2021-05-05
  • springboot中動態(tài)權(quán)限實時管理的實現(xiàn)詳解

    springboot中動態(tài)權(quán)限實時管理的實現(xiàn)詳解

    這篇文章主要為大家詳細(xì)介紹了如何簡單實現(xiàn)一個在springboot中動態(tài)權(quán)限的實時管理,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2024-10-10
  • 基于springboot+jwt實現(xiàn)刷新token過程解析

    基于springboot+jwt實現(xiàn)刷新token過程解析

    這篇文章主要介紹了基于springboot+jwt實現(xiàn)刷新token過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • Java面向?qū)ο蠡A(chǔ)知識之?dāng)?shù)組和鏈表

    Java面向?qū)ο蠡A(chǔ)知識之?dāng)?shù)組和鏈表

    這篇文章主要介紹了Java面向?qū)ο蟮闹當(dāng)?shù)組和鏈表,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-11-11
  • SpringCloud之loadbalancer負(fù)載均衡組件實戰(zhàn)詳解

    SpringCloud之loadbalancer負(fù)載均衡組件實戰(zhàn)詳解

    LoadBalancer是Spring Cloud官方提供的負(fù)載均衡組件,可用于替代Ribbon,這篇文章主要介紹了SpringCloud之loadbalancer負(fù)載均衡組件,需要的朋友可以參考下
    2023-06-06
  • SpringAop攔截參數(shù)帶注解的方法

    SpringAop攔截參數(shù)帶注解的方法

    這篇文章主要介紹了SpringAop攔截參數(shù)帶注解的方法,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2024-12-12
  • 如何調(diào)試報表插件

    如何調(diào)試報表插件

    在項目開發(fā)過程中插件調(diào)試非常的麻煩,需要修改里面的代碼,編譯出class,需要重新打包插件。然后把之前的刪除,重新安裝最新的。調(diào)試過程比較繁瑣,而且不能調(diào)試,十分的不方便,這篇文章主要介紹的是調(diào)試報表插件的方法,需要的朋友可以參考下
    2015-07-07
  • java實現(xiàn)解析Cron時間表達(dá)式為中文描述

    java實現(xiàn)解析Cron時間表達(dá)式為中文描述

    這篇文章主要為大家詳細(xì)介紹了java如何實現(xiàn)解析Cron時間表達(dá)式為中文描述,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解下
    2023-11-11
  • 詳解elasticsearch實現(xiàn)基于拼音搜索

    詳解elasticsearch實現(xiàn)基于拼音搜索

    這篇文章主要為大家介紹了詳解elasticsearch實現(xiàn)基于拼音搜索示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Spring?Boot?中的?@DateTimeFormat?和?@JsonFormat?的用法及作用詳解

    Spring?Boot?中的?@DateTimeFormat?和?@JsonFormat?的用法及作用詳解

    本文介紹了SpringBoot中的@DateTimeFormat和@JsonFormat注解的用法,解釋了它們在處理日期和時間數(shù)據(jù)時的作用,并通過實例代碼展示了如何在REST控制器中使用這些注解,感興趣的朋友跟隨小編一起看看吧
    2024-11-11

最新評論

内丘县| 讷河市| 平远县| 湘潭市| 邯郸县| 西和县| 浪卡子县| 扎赉特旗| 龙山县| 房山区| 乌苏市| 宜城市| 阳泉市| 宁明县| 台中县| 水城县| 神木县| 上饶市| 西城区| 珲春市| 文化| 凌云县| 廊坊市| 调兵山市| 大荔县| 合水县| 昌江| 延川县| 桂平市| 阳谷县| 河曲县| 龙胜| 陵水| 永修县| 江门市| 神池县| 云霄县| 东丰县| 清新县| 连山| 桂平市|