请检查我的JavaScript代码:该URL参数拼接方式是否正确?
嘿,先帮你揪出这段代码里的几个明显问题:
HTML实体用错地方啦:你在URL里写了
&作为参数分隔符,但在JavaScript字符串里,直接用&就够了。&是HTML里的转义字符,放到JS里会被当成普通字符串,后端解析的时候会把&question_id当成一个参数名的一部分,根本识别不出这是参数分隔符,直接导致参数解析错误。完全没做URL编码:你直接把用户输入的内容(比如textarea的内容、testinput里的值)拼到URL里,这些内容很可能包含空格、
&、=、%这类特殊字符,分分钟破坏URL结构,要么参数丢了,要么后端拿到的是乱码。必须用encodeURIComponent()给每个参数值做编码,把特殊字符转成URL能识别的格式。变量名笔误:代码里写了
var question_id=assignment_name+question_no;,但你的函数参数里明明是assg_name,这明显是手滑写错了,运行起来会直接报assignment_name is not defined的错误,得改成assg_name才行。循环拼接的坑(从你的代码片段看):循环里的URL拼接没写完,但哪怕写完,也别忘了给每个循环里的输入值做编码,不然同样会踩前面的坑。
另外补充个小建议:如果你的数据比较长(比如textarea里的问题描述),用GET请求拼URL可能会碰到浏览器的URL长度限制,这种情况更推荐用POST请求提交数据,既安全又没有长度限制。
修正后的完整代码(GET版本)
function saveToDataBase(save_id, textarea_id, question_no, assg_name, testinput, testoutput) { document.getElementById(save_id).addEventListener('click', function() { var question = document.getElementById(textarea_id).value; // 修正变量名笔误 var question_id = assg_name + question_no; // 给每个参数值做URL编码 var encodedQuestion = encodeURIComponent(question); var encodedQuestionId = encodeURIComponent(question_id); var encodedAssgName = encodeURIComponent(assg_name); // 用&做参数分隔,别用& var url = "saveQuesToDataBase.jsp?question=" + encodedQuestion + "&question_id=" + encodedQuestionId + "&assg_name=" + encodedAssgName; // 处理testinput循环,同样编码 for(var i = 0; i < testinput.length; i++) { var v = document.getElementById(testinput[i]).value; var encodedV = encodeURIComponent(v); url += "&testinput[" + i + "]=" + encodedV; } // 处理testoutput(如果需要的话) for(var j = 0; j < testoutput.length; j++) { var outVal = document.getElementById(testoutput[j]).value; var encodedOutVal = encodeURIComponent(outVal); url += "&testoutput[" + j + "]=" + encodedOutVal; } // 示例:用XMLHttpRequest发送请求 var request = new XMLHttpRequest(); request.open('GET', url, true); request.onload = function() { if (request.status >= 200 && request.status < 400) { console.log("保存成功啦"); } else { console.log("保存失败,检查下后端哦"); } }; request.send(); }); }
更推荐的POST版本(无长度限制,自动编码)
如果你的内容较长或者不想手动处理编码,用FormData发POST请求更省心:
function saveToDataBase(save_id, textarea_id, question_no, assg_name, testinput, testoutput) { document.getElementById(save_id).addEventListener('click', function() { var question = document.getElementById(textarea_id).value; var question_id = assg_name + question_no; // 用FormData自动处理参数编码和格式 var formData = new FormData(); formData.append('question', question); formData.append('question_id', question_id); formData.append('assg_name', assg_name); // 添加testinput数据 for(var i = 0; i < testinput.length; i++) { var v = document.getElementById(testinput[i]).value; formData.append('testinput[]', v); } // 添加testoutput数据 for(var j = 0; j < testoutput.length; j++) { var outVal = document.getElementById(testoutput[j]).value; formData.append('testoutput[]', outVal); } // 发送POST请求 var request = new XMLHttpRequest(); request.open('POST', 'saveQuesToDataBase.jsp', true); request.onload = function() { if (request.status >= 200 && request.status < 400) { console.log("保存成功"); } else { console.log("保存失败,请检查后端逻辑"); } }; request.send(formData); }); }
这种方式不用手动编码,FormData会自动把特殊字符转成合法格式,而且没有URL长度限制,比GET靠谱多了。
内容的提问来源于stack exchange,提问作者core

