3.前端和后端參數不一致,后端接不到數據的解決方案

目錄

1.問題背景:

(1).前端代碼:

(2).后端代碼:

(3).問題分析:

[1]前端參數構造錯誤:

[2].Api請求配置錯誤:

2.解決方案

(1).修改?role.js?中的 API 方法

(2).前端組件中的調用方式改成下面的而不是繼續拼接了

3.總結:


1.問題背景:

我在接口開發過程中,前端發送請求后,后端始終無法接收到參數。這導致前端無法獲取預期的響應數據,或返回的數據與實際需求不符。經過排查,發現問題的根源在于前端與后端參數名稱不一致,造成后端無法正確解析請求中的參數。

(1).前端代碼:

頁面:

<template><Dialog :visible="info" :title="info.title" @close="emit('cancel')" @save="onSave"><el-table ref="multipleTable" :data="allPermissions" row-key="rid" @selection-change="onSelectionChange"><el-table-column type="selection" /><el-table-column label="權限名" prop="permissionName" /><el-table-column label="資源路徑" prop="url" /></el-table></Dialog>
</template><script setup>
import { onMounted, ref } from 'vue'
import { Dialog } from '@/components';
import { ElMessage } from 'element-plus';
// 導入提取的API請求函數
import { getAllPermissions, updateRolePermissions } from '@/api/role'const { info } = defineProps(['info'])
const emit = defineEmits(['cancel'])
const multipleTable = ref(null)
let pids = []
const allPermissions = ref([])onMounted(() => {// 獲取所有權限 - 使用新的API請求函數getAllPermissions().then(data => {allPermissions.value = data;(info.data.permissions || []).map(row => {pids.push(row.pid)setTimeout(() => {// 默認選中該角色擁有的權限const target = allPermissions.value.find(item => item.pid === row.pid)if (target) {multipleTable.value.toggleRowSelection(target, true);}}, 0)})})
})const onSelectionChange = (keys) => {pids = keys.map(item => item.pid)
}const onSave = () => {const form = new FormData()form.append('rid', info.data.rid)form.append('pids', pids)// 更新角色權限 - 使用新的API請求函數updateRolePermissions(form).then(() => {ElMessage.success('操作成功')emit('cancel')})
}
</script> 

封裝的請求:

/*** 為角色更新權限* @param {Object} data - { rid: number, pids: number[] }* @returns {Promise}*/
export function updateRolePermissions(data) {return request({url: '/api/role/updatePermissionToRole',method: 'put',params: {rid: data.rid,pids: data.pids}  // 直接傳遞JSON對象})
}

(2).后端代碼:

 @PutMapping("/updatePermissionToRole")@PreAuthorize("hasAnyAuthority('/api/role/updatePermissionToRole')")public Result updatePermissionToRole(@RequestParam Integer rid,@RequestParam Integer[] pids){userRoleService.updatePermissionToUserRole(rid,pids);return Result.success(null);}

(3).問題分析:

前端代碼和后端接口存在參數格式不匹配的問題

[1]前端參數構造錯誤:

const form = new FormData()
form.append('rid', info.data.rid)
form.append('pids', pids) // 錯誤:將數組直接作為值添加

這會導致:

  • pids參數被序列化為字符串"[object Object]"
  • 后端接收到的pidsnull,觸發空指針異常

[2].Api請求配置錯誤:

export function updateRolePermissions(data) {return request({url: '/api/role/updatePermissionToRole',method: 'put',params: { // 錯誤:params會被拼接到URL,且無法正確處理數組rid: data.rid,pids: data.pids}})
}

這會導致:

  • 請求 URL 被構造為/api/role/updatePermissionToRole?rid=1&pids=1,2,3
  • Spring MVC 無法將pids=1,2,3正確解析為整數數組

2.解決方案

(1).修改?role.js?中的 API 方法


/*** 為角色更新權限* @param {Object} data - { rid: number, pids: number[] }* @returns {Promise}*/
export function updateRolePermissions(data) {// 構建查詢字符串參數const params = new URLSearchParams();params.append('rid', data.rid);// 將數組轉換為多個同名參數if (data.pids && Array.isArray(data.pids)) {data.pids.forEach(pid => {params.append('pids', pid);});}return request({url: '/api/role/updatePermissionToRole',method: 'put',params: params, // 注意:使用params而非dataheaders: {'Content-Type': 'application/x-www-form-urlencoded'}});
}

(2).前端組件中的調用方式改成下面的而不是繼續拼接了

// 組件中的調用代碼保持不變
const onSave = () => {updateRolePermissions({rid: info.data.rid,pids: pids // 直接傳遞數組}).then(() => {ElMessage.success('操作成功');emit('cancel');});
};

3.總結:

前端開發中嚴格遵守接口規范能有效避免參數傳遞錯誤。數組類型參數需特殊處理,確保與后端接口定義一致。

后端使用@RequestParam注解時,前端請求需明確設置params配置。數組參數應拆分為單個數值傳遞,避免直接傳遞數組對象。

組件調用遵循方法傳參模式,確保參數類型和結構與后端接口匹配。開發過程中定期聯調測試,及時發現參數不一致問題。

建議建立統一接口文檔規范,明確參數類型和格式要求。前后端團隊保持密切溝通,從源頭減少參數定義差異。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/89765.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/89765.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/89765.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringBoot:整合quartz實現定時任務-MisFire的處理

文章目錄 一、什么是MisFire二、MisFire發生的情況三、MisFire的補償策略四、代碼實現 一、什么是MisFire 簡單理解為&#xff1a;定時任務&#xff0c;所錯過的觸發 二、MisFire發生的情況 1、資源緊張&#xff0c;定時任務請求不到對應的線程。 2、調度器關閉。 3、設置定…

返回json,優雅處理轉換(如 0.85 → “85.00%“)

核心解決方案 通過 自定義序列化器 JsonSerialize 注解&#xff0c;實現 BigDecimal 到百分比字符串的自動轉換。 1.1 自定義序列化器代碼 java import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterx…

大語言模型LLM在訓練/推理時的padding

討論的是在訓練大型語言模型&#xff08;Transformer-based models&#xff0c;比如GPT等&#xff09;時&#xff0c;文本序列的填充&#xff08;padding&#xff09;問題&#xff0c;即訓練和推理時分辨填充在序列的左側&#xff08;left padding&#xff09;或右側&#xff0…

50 個常用 Docker 命令

1. Docker 基礎命令 查看 Docker 版本 docker --version查看 Docker 運行狀態 systemctl status docker查看 Docker 信息 docker info查看幫助信息 docker help2. 鏡像管理 拉取鏡像 docker pull <鏡像名>查看本地鏡像 docker images刪除鏡像 docker rmi <鏡…

紋理貼圖算法研究論文綜述

紋理貼圖&#xff08;Texture Mapping&#xff09;是計算機圖形學和計算機視覺中的核心技術&#xff0c;廣泛應用于三維重建、游戲渲染、虛擬現實&#xff08;VR&#xff09;、增強現實&#xff08;AR&#xff09;等領域。對其算法的研究涵蓋了紋理生成、映射、縫合、優化等多個…

關于使用cursor tunnel鏈接vscode(避免1006 issue的做法)

詳細步驟 第 1 步&#xff1a;在你的本地機器上準備好 Cursor 這一步很簡單&#xff0c;你可能已經完成了。只需確保你的本地電腦上已經安裝了 Cursor 桌面應用程序。 要做的事&#xff1a;無&#xff0c;只需確保 Cursor 已安裝。 第 2 步&#xff1a;在遠程服務器上安裝 Curs…

Redis常見性能問題和解決方案有哪些

Redis 作為高性能的內存數據庫&#xff0c;在電商等高并發場景中廣泛使用&#xff0c;但可能因配置、使用不當或環境限制出現性能問題。以下是 Redis 常見的性能問題及其解決方案&#xff0c;結合電商場景&#xff0c;用中文簡潔說明&#xff1a;### 1. **高延遲&#xff08;響…

明遠智睿RK3588:創新了高性能,讓顧慮煙消云散

在科技浪潮的推動下&#xff0c;高性能開發已經成為眾多行業發展的核心驅動力。從智能交通的車路協同&#xff0c;到醫療領域的影像診斷&#xff1b;從智能家居的智能控制&#xff0c;到工業互聯網的智能制造&#xff0c;每一個領域都對模塊的性能提出了極高的要求。然而&#…

I Data Lab

萬事開頭難&#xff0c;尤其是和 0 與 1 打交道&#xff0c;和后面的實驗相比&#xff0c;這次只能算個熱身。但是喜歡運動的都知道&#xff0c;熱身很重要&#xff01;任務目標我們先來看看 Datalab 需要我們做什么。主要是通過這次的作業來熟悉整型及浮點數的位表達形式&…

SQLite 安裝使用教程

一、SQLite 簡介 SQLite 是一個輕量級的關系型數據庫管理系統&#xff0c;嵌入式、零配置、無需安裝服務器&#xff0c;廣泛應用于移動端開發&#xff08;如 Android&#xff09;、桌面應用、小型網站等場景。 二、下載安裝 2.1 官方網站下載 訪問 SQLite 官網 下載適用于操…

Python-Word文檔、PPT、PDF以及Pillow處理圖像詳解

Python操作Word和PowerPoint文件操作Word文檔命令來安裝python-docx三方庫。pip install python-docxfrom docx import Document from docx.shared import Inches, Pt, RGBColor from docx.enum.text import WD_ALIGN_PARAGRAPH from docx.enum.table import WD_TABLE_ALIGNMEN…

高可擴展屬性建模設計:架構師的全局思考與落地方案

在復雜業務系統中&#xff0c;動態屬性擴展始終是架構設計的核心難題之一。傳統方案如寬表設計和EAV&#xff08;實體-屬性-值&#xff09;模型分別在性能與擴展性上各有優勢與劣勢&#xff0c;但也都有明顯局限。 為了兼顧性能、擴展性、維護成本&#xff0c;需要引入更靈活的…

數據結構入門:鏈表

鏈式存儲結構通過使用指針將分散的存儲單元鏈接起來&#xff0c;每個元素由數據部分和指針部分組成。 鏈式表的定義和特點 鏈式表的每個節點包含兩個部分&#xff1a; 數據域&#xff1a;存儲數據元素。指針域&#xff1a;存儲下一個節點的內存地址。 鏈式表的頭指針指向第一個…

達夢數據庫DMHS介紹及安裝部署

目錄 概述 安裝規劃 安裝步驟 上傳安裝包 更改權限 執行安裝命令 源端和目的端處理 開啟歸檔 開啟邏輯日志 創建測試表 生成測試數據 配置目的端文件 配置源端文件 啟動目的端 啟動源端 裝載數據 源端開啟cpt模塊 數據同步驗證 隨機數據驗證 概述 達夢數據實時同…

BERT 模型詳解:結構、原理解析

前言 在自然語言處理&#xff08;NLP&#xff09;領域&#xff0c;BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;已經成為理解類任務的標配模型。相比 GPT 更擅長文本生成&#xff0c;BERT 則在語言理解任務上展現出卓越的能力。本文…

一、bfv_basics

目錄 一、加密參數 EncryptionParameters類1. 三個重要的參數2. 參數的作用3. 同態加密方案4. 多項式模數的度 poly_modulus_degree (n)5. 密文模數 coeff_modulus (q)6. 明文模數 plain_modulus (t&#xff0c;這是 BFV 方案才有的&#xff0c;CKKS 沒有) 二、上下文 SEALCont…

AI大模型LangChain架構介紹及其在環保領域的應用

1.LangChain 概述與架構 LangChain 是一個面向大型語言模型&#xff08;LLM&#xff09;應用的開發框架&#xff0c;其核心理念是將復雜的基于語言的 AI 系統拆分為可復用的模塊&#xff0c;簡化 LLM 與數據源的集成。LangChain 官方文檔將其定義為“一個用于開發以 LLM 為驅動…

centos 7 安裝NVIDIA Container Toolkit

要在 CentOS 7 上離線安裝 NVIDIA Container Toolkit&#xff0c;需確保已安裝 NVIDIA 驅動和 Docker 環境。以下是完整步驟及注意事項&#xff1a; ?? 一、環境準備 驗證 NVIDIA 驅動 運行 nvidia-smi 確認驅動已正確安裝&#xff0c;若未安裝需先離線安裝驅動&#xff1a; …

C++學習之STL學習:list的使用

本篇我們將學習STL中list的使用 目錄 list的初始和官方文檔 list的官方文檔 list的構造與析構 構造函數 析構函數 運算符重載 迭代器 正向迭代器 反向迭代器 const正向迭代器 const反向迭代器 容量 empty size max_size 訪問 訪問第一個元素?編輯 訪問最后一個元素 修…

USB服務器在證券公司虛擬化進程中的應用分析

在證券公司全面擁抱虛擬化、云化的技術浪潮中&#xff0c;一個看似微小卻至關重要的環節曾長期阻礙進程&#xff1a;分散在各業務環節的銀行前置機U盾、各種系統認證Ukey等物理USB安全設備的管理難題。這些承載著資金劃撥、交易認證核心權限的“小鑰匙”&#xff0c;在傳統模式…