Можно ли отправить одну переменную несколько раз через POST, используя JavaScript? - PullRequest
0 голосов
/ 06 января 2012

Позвольте мне объяснить, почему мне нужно это сделать!

Мне нужно отправить запрос на другой сервер, чтобы его формат был примерно таким:

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Большая «ошибка»

Я использовал два разных метода для отправки этого запроса 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), но он не работает, когда я использую одно имя переменной для всех входных данных.

Затем я использовал эту функцию для отправки запроса POSTпо ajax:

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 ]

1 голос
/ 06 января 2012

Использование Firefox с плагином TamperData и формой, в которой просто есть четыре поля, все из которых определены как <input type="text" name="item"> Я вижу, что данные POST действительно отправляют четыре переменные, все с именем "item", но с разными значения для каждого.

Тогда принимающий сервер должен сделать что-то разумное с этим. Большинство систем просто используют одно из четырех отправленных значений (может быть, первое или последнее), но если уже есть сервер, который правильно обрабатывает http://www.test.ccom/process?item=1AAA&item=1AAA&item=1AAA, то добавление нескольких полей будет называться «item». должно работать.

Если это не так, то вам нужно написать что-нибудь, чтобы справиться с этим на сервере конец вещей - никакое количество javascript-кодирования не сделает этого. Это потребовало бы получения всего тела POST и его обработки самостоятельно, поскольку большинство серверных сред (как я уже говорил), как правило, просто используют одно из значений.

Вы можете использовать TamperData или что-то подобное для захвата потока данных HTTP и просмотра того, что на самом деле передается из имеющегося у вас JavaScript.


Итак, в конечном счете, ответ на ваш вопрос: «Можно ли отправить одну переменную несколько раз через POST, используя javascript?» да , возможно.

1 голос
/ 06 января 2012

Если вы передаете все переменные с одинаковыми именами, т. Е. 'Item', тогда обработчик запросов не сможет их различить. Вот почему вы получаете только 1 элемент. Попробуйте переименовать элементы в item1 = value & item2 = value & item3 = value.

Если вы передаете 100 элементов, вам определенно следует использовать метод post. Проблема с именами будет существовать как для публикации, так и для получения, поэтому убедитесь, что все элементы имеют разные имена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...