javascript с открытым методом XMLHttpRequest: использование сообщения и его параметров

В идеале пользователи моего веб-сайта будут отправлять несколько сотен сообщений на сервер базы данных в течение часа (в основном это онлайн-эксперимент). Эксперимент реализован на js, поэтому я пытаюсь использовать объект XMLHttpRequest для публикации данных, которые собирает скрипт.

В чем я не уверен, так это в том, как использовать параметр POST. Я хочу установить около 8 различных пар ключ/значение для переменной $_POST, чтобы она могла быть доступна для страницы .php для обработки перед отправкой на сервер базы данных. Я не заинтересован в получении какой-либо информации с самого сервера, а только в ее отправке (поэтому, и я не уверен, что это правильный подход, я устанавливаю для условия readyState значение «1»/open).

Вот скрипт, над которым я сейчас работаю:

function postData(dataList) {

 var xmlhttp = new XMLHttpRequest();
 var processingUrl = "process_exercise_data.php";
 var POSTBody = "";
 POSTBody+="block_type="+encodeURIComponent(dataList[0]);
 POSTBody+="&block_number="+encodeURIComponent(dataList[1]);
 POSTBody+="&trial_type="+encodeURIComponent(dataList[2]);
 POSTBody+="&trial_number="+encodeURIComponent(dataList[3]);
 POSTBody+="&input_value="+encodeURIComponent(dataList[4]);
 POSTBody+="&output_value="+encodeURIComponent(dataList[5]);
 POSTBody+="&prediction_value="+encodeURIComponent(dataList[6]);
 POSTBody+="&error="+encodeURIComponent(dataList[7]);


 xmlhttp.open("POST",processingUrl,true);
 if (xmlhttp.readyState==4) {
  xmlhttp.send(POSTBody);
 }

}

Основная цель — отправить пары ключ/значение на страницу .php с помощью POST, оставаясь при этом на текущей странице (простой запрос AJAX, если я не ошибаюсь). Любые комментарии или предложения очень ценятся!

Помните, все, что я пытаюсь сделать, это чтобы пользователь, когда он/она действует определенным образом при определенных условиях (вне области действия этой функции), вызывал эту функцию и отправлял эти данные на сервер. Текст ответа сервера не требуется.

РЕДАКТИРОВАТЬ:

Теперь мой вопрос таков: смогу ли я получить доступ к массиву $_POST на странице обработки php? Вот пример:

$block_type = $_POST['block.type'];

person intelligencer    schedule 14.09.2009    source источник
comment
Где вы научились устанавливать заголовки для данных поста? Любой базовый учебник должен был рассказать вам, как публиковать данные.   -  person epascarello    schedule 14.09.2009


Ответы (3)


Вы не хотите устанавливать заголовки запроса. Что вы хотите, так это отправить запрос body вместе. И тело должно быть как

'block_type='+encodeURIComponent(dataList[0])+'&block_number='+encodeURIComponent(dataList[1])

и т. д. Думаю, вы поняли идею. Тело — это то, что вы передаете методу send() объекта XMLHTTPRequest.

person Michael Krelin - hacker    schedule 14.09.2009
comment
+1. Просто добавьте это, чтобы адресовать ответ сервера A, это ненужный бит: ответ необходим, иначе браузер решит, что запрос не выполнен. Если ответ body не должен содержать ничего, то код ответа сервера, вероятно, должен быть установлен на 204 No Content или, возможно, 201 Created. В PHP это может быть достигнуто с помощью функции header(), например. заголовок (HTTP/1.1 204 Нет содержимого); - person NickFitz; 14.09.2009
comment
ммм. Ну да, но я так понимаю, что вопрос касается клиентской стороны. - person Michael Krelin - hacker; 14.09.2009

Подумайте об использовании jQuery, это значительно облегчит вашу задачу. Используя метод jQuery.post, вам нужно указать только хэш data, у вас нет беспокоиться о сериализации, правильном экранировании или readyState.

person Adam Byrtek    schedule 14.09.2009

Вы должны вызвать send, прежде чем readyState изменится.

Заменять

xmlhttp.open("POST",processingUrl,true);
if (xmlhttp.readyState=4) {
  xmlhttp.send(POSTBody);
}

с

xmlhttp.open("POST", processingUrl, false);
xmlhttp.send(POSTBody);

Если вы хотите обработать ответ, добавьте определение xmlhttp.onreadystatechange:

xmlhttp.open("POST", processingUrl, false);
xmlhttp.onreadystatechange = function () {
  if (this.readyState === 4) {
    // handle response
  }
};
xmlhttp.send(POSTBody);

Изменить: я также хотел бы упомянуть, что = - это не оператор равенства JavaScript, а оператор присваивания. Используйте === для проверки на равенство и == для проверки на равенство с преобразованием типов.

person Eli Grey    schedule 14.09.2009
comment
Также стоит отметить тот факт, что вы должны установить onreadystatechange перед вызовом send(), иначе ваши обратные вызовы AJAX будут случайным образом давать сбой. - person Christian; 31.08.2011