Отправка данных POST с помощью XMLHttpRequest
Я хотел бы отправить некоторые данные с помощью XMLHttpRequest в JavaScript.
скажем, у меня есть следующая форма в HTML:
<form name="inputform" action="somewhere" method="post">
<input type="hidden" value="person" name="user">
<input type="hidden" value="password" name="pwd">
<input type="hidden" value="place" name="organization">
<input type="hidden" value="key" name="requiredkey">
</form>
Как я могу написать эквивалент с помощью XMLHttpRequest в JavaScript?
8 ответов:
приведенный ниже код демонстрирует, как это сделать.
var http = new XMLHttpRequest(); var url = 'get_data.php'; var params = 'orem=ipsum&name=binny'; http.open('POST', url, true); //Send the proper header information along with the request http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); http.onreadystatechange = function() {//Call a function when the state changes. if(http.readyState == 4 && http.status == 200) { alert(http.responseText); } } http.send(params);
var xhr = new XMLHttpRequest(); xhr.open('POST', 'somewhere', true); xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); xhr.onload = function () { // do something to response console.log(this.responseText); }; xhr.send('user=person&pwd=password&organization=place&requiredkey=key');или если вы можете рассчитывать на поддержку браузера, вы можете использовать FormData:
var data = new FormData(); data.append('user', 'person'); data.append('pwd', 'password'); data.append('organization', 'place'); data.append('requiredkey', 'key'); var xhr = new XMLHttpRequest(); xhr.open('POST', 'somewhere', true); xhr.onload = function () { // do something to response console.log(this.responseText); }; xhr.send(data);
минимальное использование
FormDataчтобы отправить запрос AJAX<!DOCTYPE html> <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=Edge, chrome=1"/> <script> "use strict"; function submitForm(oFormElement) { var xhr = new XMLHttpRequest(); xhr.onload = function(){ alert (xhr.responseText); } // success case xhr.onerror = function(){ alert (xhr.responseText); } // failure case xhr.open (oFormElement.method, oFormElement.action, true); xhr.send (new FormData (oFormElement)); return false; } </script> </head> <body> <form method="post" action="somewhere" onsubmit="return submitForm(this);"> <input type="hidden" value="person" name="user" /> <input type="hidden" value="password" name="pwd" /> <input type="hidden" value="place" name="organization" /> <input type="hidden" value="key" name="requiredkey" /> <input type="submit" value="post request"/> </form> </body> </html>Примечания
это не полностью отвечает на вопрос OP, потому что он требует, чтобы пользователь щелкнул, чтобы отправить запрос. Но это может быть полезно для людей, ищущих такого рода простое решение.
этот пример очень прост и не поддерживает
GETметод. Если вам интересны более сложные примеры, пожалуйста посмотрите на отлично документация MDN. Смотрите также аналогичный ответ о XMLHttpRequest для публикации HTML-формы.ограничение этого решения: как указано Джастин Пустой и Томас Мунк (см. свои комментарии),
FormDataНе поддерживается IE9 и ниже, а также браузер по умолчанию на Android 2.3.
используйте современный JavaScript!
Я бы предложил заглянуть в
fetch. Это эквивалент ES5 и использует обещания. Он гораздо более удобочитаем и легко настраивается.const url = "http://example.com"; fetch(url, { method : "POST", body: new FormData(document.getElementById("inputform")), // -- or -- // body : JSON.stringify({ // user : document.getElementById('user').value, // ... // }) }).then( response => response.text() // .json(), etc. // same as function(response) {return response.text();} ).then( html => console.log(html) );Подробнее:
ПЛАГИНЫ НЕ НУЖНЫ!
просто перетащите любую ссылку (т. е. ЭТА ССЫЛКА) в ПАНЕЛЬ ЗАКЛАДОК (если вы не видите его, включите из настроек браузера), то EDIT вот ссылка :
и вставить код javascript:
javascript:var my_params = prompt("Enter your parameters", "var1=aaaa&var2=bbbbb"); var Target_LINK = prompt("Enter destination", location.href); function post(path, params) { var xForm = document.createElement("form"); xForm.setAttribute("method", "post"); xForm.setAttribute("action", path); for (var key in params) { if (params.hasOwnProperty(key)) { var hiddenField = document.createElement("input"); hiddenField.setAttribute("name", key); hiddenField.setAttribute("value", params[key]); xForm.appendChild(hiddenField); } } var xhr = new XMLHttpRequest(); xhr.onload = function () { alert(xhr.responseText); }; xhr.open(xForm.method, xForm.action, true); xhr.send(new FormData(xForm)); return false; } parsed_params = {}; my_params.split("&").forEach(function (item) { var s = item.split("="), k = s[0], v = s[1]; parsed_params[k] = v; }); post(Target_LINK, parsed_params); void(0);вот и все! теперь вы можете посетить любой сайт, и нажмите эту кнопку в ПАНЕЛЬ ЗАКЛАДОК!
Примечание:
выше метод отправляет данные с помощью
XMLHttpRequestметод, таким образом, вы должны быть в том же домене при запуске скрипта. Вот почему я предпочитаю отправлять данные с имитацией формы отправки, которая может отправить код в любой домен-вот код для этого:javascript:var my_params=prompt("Enter your parameters","var1=aaaa&var2=bbbbb"); var Target_LINK=prompt("Enter destination", location.href); function post(path, params) { var xForm= document.createElement("form"); xForm.setAttribute("method", "post"); xForm.setAttribute("action", path); xForm.setAttribute("target", "_blank"); for(var key in params) { if(params.hasOwnProperty(key)) { var hiddenField = document.createElement("input"); hiddenField.setAttribute("name", key); hiddenField.setAttribute("value", params[key]); xForm.appendChild(hiddenField); } } document.body.appendChild(xForm); xForm.submit(); } parsed_params={}; my_params.split("&").forEach(function(item) {var s = item.split("="), k=s[0], v=s[1]; parsed_params[k] = v;}); post(Target_LINK, parsed_params); void(0);
вот полное решение с
application-json:// Input values will be grabbed by ID <input id="loginEmail" type="text" name="email" placeholder="Email"> <input id="loginPassword" type="password" name="password" placeholder="Password"> // return stops normal action and runs login() <button onclick="return login()">Submit</button> <script> function login() { // Form fields, see IDs above const params = { email: document.querySelector('#loginEmail').value, password: document.querySelector('#loginPassword').value } const http = new XMLHttpRequest() http.open('POST', '/login') http.setRequestHeader('Content-type', 'application/json') http.send(JSON.stringify(params)) // Make sure to stringify http.onload = function() { // Do whatever with response alert(http.responseText) } } </script>убедитесь, что ваш серверный API может анализировать JSON.
например, в Express JS:
import bodyParser from 'body-parser' app.use(bodyParser.json())
я столкнулся с подобной проблемой, используя тот же пост и это ссылке я решил свою проблему.
var http = new XMLHttpRequest(); var url = "MY_URL.Com/login.aspx"; var params = 'eid=' +userEmailId+'&pwd='+userPwd 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);// all browser wont support Refused to set unsafe header "Content-Length" //http.setRequestHeader("Connection", "close");//Refused to set unsafe header "Connection" // Call a function when the state http.onreadystatechange = function() { if(http.readyState == 4 && http.status == 200) { alert(http.responseText); } } http.send(params);этой ссылке имеет полную информацию.
var util = { getAttribute: function (dom, attr) { if (dom.getAttribute !== undefined) { return dom.getAttribute(attr); } else if (dom[attr] !== undefined) { return dom[attr]; } else { return null; } }, addEvent: function (obj, evtName, func) { //Primero revisar attributos si existe o no. if (obj.addEventListener) { obj.addEventListener(evtName, func, false); } else if (obj.attachEvent) { obj.attachEvent(evtName, func); } else { if (this.getAttribute("on" + evtName) !== undefined) { obj["on" + evtName] = func; } else { obj[evtName] = func; } } }, removeEvent: function (obj, evtName, func) { if (obj.removeEventListener) { obj.removeEventListener(evtName, func, false); } else if (obj.detachEvent) { obj.detachEvent(evtName, func); } else { if (this.getAttribute("on" + evtName) !== undefined) { obj["on" + evtName] = null; } else { obj[evtName] = null; } } }, getAjaxObject: function () { var xhttp = null; //XDomainRequest if ("XMLHttpRequest" in window) { xhttp = new XMLHttpRequest(); } else { // code for IE6, IE5 xhttp = new ActiveXObject("Microsoft.XMLHTTP"); } return xhttp; } }; //START CODE HERE. var xhr = util.getAjaxObject(); var isUpload = (xhr && ('upload' in xhr) && ('onprogress' in xhr.upload)); if (isUpload) { util.addEvent(xhr, "progress", xhrEvt.onProgress()); util.addEvent(xhr, "loadstart", xhrEvt.onLoadStart); util.addEvent(xhr, "abort", xhrEvt.onAbort); } util.addEvent(xhr, "readystatechange", xhrEvt.ajaxOnReadyState); var xhrEvt = { onProgress: function (e) { if (e.lengthComputable) { //Loaded bytes. var cLoaded = e.loaded; } }, onLoadStart: function () { }, onAbort: function () { }, onReadyState: function () { var state = xhr.readyState; var httpStatus = xhr.status; if (state === 4 && httpStatus === 200) { //Completed success. var data = xhr.responseText; } } }; //CONTINUE YOUR CODE HERE. xhr.open('POST', 'mypage.php', true); xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); if ('FormData' in window) { var formData = new FormData(); formData.append("user", "aaaaa"); formData.append("pass", "bbbbb"); xhr.send(formData); } else { xhr.send("?user=aaaaa&pass=bbbbb"); }

Comments