让我解释为什么我需要这样做!
我需要向另一台服务器发送一个请求,其格式是这样的:
http://www.test.ccom/process?item=1AAA&item=2BBB&item=3CCC
此URL将向结果页面添加3个不同的项目(每个项目一个),如下所示:
Item = 1AAA Count=1
Item = 2BBB Count=1
Item = 3CCC Count=1
如果我只想添加一个项目中的3个,我应该使用它:
http://www.test.ccom/process?item=1AAA&item=1AAA&item=1AAA
结果页面将是这样的:
Item = 1AAA Count=3
我的问题是我无法使用GET方法发送请求(因为我们希望每个项目添加超过100个,这会导致“Request-URI Too Large”错误)
我使用两种不同的方法通过POST发送此请求,但没有成功。
首先我使用了这个功能:
function post_by_form(path, params) {
// The rest of this code assumes you are not using a library.
// It can be made less wordy if you use one.
var form = document.createElement("form");
form.setAttribute("method", "post");
form.setAttribute("action", path);
form.setAttribute("style", "display: none")
for(var key in params) {
var hiddenField = document.createElement("input");
hiddenField.setAttribute("type", "hidden");
hiddenField.setAttribute("name", "item");
hiddenField.setAttribute("value", params[key]);
form.appendChild(hiddenField);
}
document.body.appendChild(form);
form.submit();
}
当我使用不同的变量名称(name =“item”+ key)测试它时,它可以工作,但是当我为所有输入使用一个变量名时,它不起作用。
然后我使用此函数通过ajax发送POST请求:
function post_by_ajax(path, params_arr){
var http = new XMLHttpRequest();
var url = path;
var params = "";
for(var key in params_arr) {
if (params != "")
params += "&item="+params_arr[key];
else
params += "item="+params_arr[key];
}
http.open("POST", url, true);
//Send the proper header information along with the request
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.setRequestHeader("Content-length", params.length);
http.setRequestHeader("Connection", "close");
http.onreadystatechange = function() {//Call a function when the state changes.
if(http.readyState == 4 && http.status == 200) {
alert(http.responseText);
}
}
http.send(params);
}
同样的结果,这两种方法都只返回一个数量只有一个项目(最后一个)...虽然我们可以提交一个包含许多输入字段的表单,但是为什么我不能使用这些方法?!我的逻辑有什么问题吗?!有人可以帮帮我吗?!
答案 0 :(得分:1)
如果您传递的所有变量具有相同的名称,即:'item',则请求处理程序无法区分它们。这就是为什么你只得到1个元素。尝试将元素重命名为item1 = value& item2 = value& item3 = value。
如果你传递了100个元素,那么你肯定应该使用post方法。 post和get都会存在名称问题,因此请确保所有项目的名称都不同。
答案 1 :(得分:1)
将Firefox与TamperData插件一起使用,以及一个只有四个字段全部指定为<input type="text" name="item">
的表单我可以看到POST数据确实发送了所有名为“item”的四个变量但每个人都有不同的价值观。
然后由接收服务器做一些合理的事情。大多数系统只使用发送的四个值中的一个(可能是第一个或最后一个)但是如果已经有一个正确处理http://www.test.ccom/process?item=1AAA&item=1AAA&item=1AAA
的服务器,则添加多个字段全部命名“项目”应该有效。
如果情况并非如此,那么你需要在服务器结尾处写一些东西来处理它 - 没有多少javascript编码会这样做。这将涉及获取整个POST主体并自行处理它,因为大多数服务器端框架(如我所说)通常只使用其中一个值。
您可以使用TamperData或类似的东西捕获HTTP数据流,并查看您现在从javascript实际传输的内容。
最终,您的问题的答案“是否可以使用javascript通过POST多次发送一个变量?”是是,这是可能的。