是否可以使用javascript通过POST多次发送一个变量?

时间:2012-01-05 21:02:22

标签: javascript ajax http-post

让我解释为什么我需要这样做!

我需要向另一台服务器发送一个请求,其格式是这样的:

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);
}

同样的结果,这两种方法都只返回一个数量只有一个项目(最后一个)...虽然我们可以提交一个包含许多输入字段的表单,但是为什么我不能使用这些方法?!我的逻辑有什么问题吗?!有人可以帮帮我吗?!

2 个答案:

答案 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多次发送一个变量?”是,这是可能的。