2014-12-05 5 views
0

Я только начинаю изучать, как использовать XMLHttpRequest, и я начал с примера this из w3schools, который я хочу изменить, чтобы отправить строку. Это новый код:Отправьте строку через запрос http

<!DOCTYPE html> 
<html> 
<head> 
<script> 
function loadXMLDoc() { 
    var xmlhttp; 
    var str="sent string"; 
    xmlhttp=new XMLHttpRequest(); 
    xmlhttp.open("GET","ajax_info.txt",true); 
    xmlhttp.send(str); 
    alert(xmlhttp.responseText); 
} 
</script> 
</head> 
<body> 
<div id="myDiv"><h2>Let AJAX change this text</h2></div> 
<button type="button" onclick="loadXMLDoc()">Change Content</button> 
</body> 
</html> 

Я хочу вывести ответ и посмотреть, была ли строка отправлена, но предупреждение ничего не возвращает. Просто пустое окно. Что я делаю не так?

Кроме того, я нашел пример в этом question, который также добавляет эти строки кода:

http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
http.setRequestHeader("Content-length", params.length); 
http.setRequestHeader("Connection", "close"); 

Всегда ли они необходимы? Если да, то почему? Код с этой страницы также отправляет строку, но этот код тоже не работает для меня.

EDIT: Это мой обновленный код, который по-прежнему не работает. Я даже пробовал его, не отправляя строку, но ничего не происходит. Я не пытаюсь его больше в w3wschools, но вместо того, чтобы в нужном месте, у меня нет моего кода в функции больше и сделаны изменения, которые @Quentin рассказал мне о:

<script> 
var xmlhttp=null; 
var str="sent_string"; 
xmlhttp=new XMLHttpRequest(); 
xmlhttp.open("POST","http://192.168.1.3:80",true); 
xmlhttp.setRequestHeader("Content-type", "text/plain"); 
xmlhttp.setRequestHeader("Content-length", str.length); 
xmlhttp.setRequestHeader("Connection", "close"); 
xmlhttp.send(str); 
xmlhttp.addEventListener('load', function() {  
    alert(this.responseText); 
    alert(xmlhttp.readyState);} 
); 
</script> 
+0

Не используйте w3schools, как никогда. В ответ на ваш вопрос использование необработанного XmlHttpRequest почти никогда не является хорошей идеей. Проверьте jQuery и друзей, которые обеспечивают простой интерфейс по поводу сложностей: http://api.jquery.com/jQuery.ajax/ – jjm

ответ

1

Первый, вы не дожидаясь ответа HTTP, прежде чем пытаться предупредить значение.

alert(xmlhttp.responseText); 

должно быть:

xmlhttp.addEventListener('load', function() { 
    alert(this.responseText); 
}); 

Второй, вы делаете запрос GET с телом сообщения. Вам нужен (POST или PUT) запрос, если вы хотите, чтобы отправить тело запроса:

xmlhttp.open("POST","ajax_info.txt",true); 

Третий, вы посылаете запрос в виде обычного текста, но указывает серверу, что это форма кодирования.

http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 

должен быть

xmlhttp.setRequestHeader("Content-type", "text/plain"); 
+0

Я изменил свой вопрос так, чтобы он содержал новую версию моего кода, которая все еще не работает. – user1956190

+0

Теперь нет ничего очевидного. Что говорит консоль JS? Что говорит вкладка Net в ваших инструментах разработчика? – Quentin

+0

Консоль JS: символьная кодировка HTML-документа не была объявлена. Кроме этого ничего. И я не думаю, что эта ошибка помогает мне в чем-либо. На вкладке «Сеть» ничего не отображается. Есть ли другой способ увидеть некоторые ошибки? Или, возможно, попробовать его на другом сайте? Как и у w3schools ... – user1956190

0

если вы хотите отправить что-то с запросом ajax есть два способа: POST и GET.

Вам нужно будет прочитать об этом перед отправкой чего-либо. Просто Google для REST или HTTP POST. Вы найдете все.

Чем я предлагаю вам использовать AngularJS или jQuery вместо обычного вызова ajax.

Например, в AngularJS, все, что вам нужно сделать, это:

$http.get('mypage.php?name=john').success(function (data) { 

//work with the answer in data 

}); 
+0

Возможно, вы захотите упомянуть, что AngularJS является полнофункциональной инфраструктурой веб-приложений, тогда как jQuery может при необходимости отбрасываться. – jjm

+0

Ну да, это правильно ... :-) –

Смежные вопросы