首页 文章

使用XMLHttpRequest发送POST数据

提问于
浏览
406

我想在JavaScript中使用XMLHttpRequest发送一些数据 .

假设我在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>

如何在JavaScript中使用XMLHttpRequest编写等效文件?

8 回答

  • 217

    下面的代码演示了如何执行此操作 .

    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);
    
  • 2
    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);
    
  • 23

    使用现代JavaScript!

    我建议调查 fetch . 它是ES5的等价物并使用Promises . 它更易读,更容易定制 .

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

    更多信息:

    Mozilla Documentation

    Can I Use (88% Mar 2018)

    Matt Walsh Tutorial

  • 31

    最少使用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 documentation . 另见similar answer about XMLHttpRequest to Post HTML Form .

    • 此解决方案的局限性:正如Justin BlankThomas Munk(参见他们的评论)所指出的,IE9及更低版本以及Android 2.3上的默认浏览器不支持 FormData .

  • 3

    没有需要的插件!

    只需在 BOOKMARK BAR 中拖动任何链接(即THIS LINK)(如果您没有看到它,从浏览器设置启用),然后 EDIT 链接:

    enter image description here

    并插入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);
    

    That's all! 现在您可以访问任何网站,然后单击 BOOKMARK BAR 中的该按钮!


    注意:

    上面的方法使用 XMLHttpRequest 方法发送数据,因此,您必须在触发脚本时位于同一个域中 . 这就是为什么我更喜欢使用模拟的FORM SUBMITTING发送数据,这可以将代码发送到任何域 - 这里是代码:

    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);
    
  • 16

    这是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>
    

    确保您的Backend API可以解析JSON .

    例如,在Express JS中:

    import bodyParser from 'body-parser'
    app.use(bodyParser.json())
    
  • 587

    我遇到过类似的问题,使用相同的帖子而且这个link我已经解决了我的问题 .

    var http = new XMLHttpRequest();
     var url = "MY_URL.Com/login.aspx";
     var params = 'eid=' +userEmailId+'&amp;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);
    

    link已完成信息 .

  • 35
    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");
    }
    

相关问题