XMLHttpRequest를 사용하여 POST 데이터 보내기
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를 사용하여 동등한 내용을 작성하려면 어떻게해야합니까?
아래 코드는이를 수행하는 방법을 보여줍니다.
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);
최신 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)
);
Node.js에서 다음을 fetch
사용하여 가져와야합니다 .
const fetch = require("node-fetch");
동 기적으로 사용하려면 (상위 범위에서는 작동하지 않음) :
const json = await fetch(url, optionalOptions)
.then(response => response.json()) // .text(), etc.
.catch((e) => {});
더 많은 정보:
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 문서를 살펴보십시오 . HTMLHttpRequest to Post HTML Form 에 대한 비슷한 답변 도 참조하십시오 .이 솔루션의 한계 : Justin Blank 와 Thomas Munk (댓글 참조)
FormData
가 지적한 바와 같이 IE9 이하 및 Android 2.3의 기본 브라우저는 지원되지 않습니다.
다음은 완벽한 솔루션입니다
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())
필요한 플러그인이 없습니다!
BOOKMARK BAR ( 링크가 보이지 않으면 브라우저 설정에서 활성화 )에 있는 링크 (예 : 이 링크 )를 드래그 한 다음 해당 링크 를 편집 하십시오.
자바 스크립트 코드를 삽입하십시오.
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);
그게 다야! 이제 모든 웹 사이트를 방문하고 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);
같은 게시물을 사용하여 비슷한 문제에 직면 했으며이 링크를 사용하여 문제를 해결했습니다.
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");
}
기능 독자가이 질문을 찾는 경우에만 해당됩니다. 주어진 경로가있는 한 받아 들인 대답이 제대로 작동한다는 것을 알았지 만 비워두면 IE에서 실패합니다. 다음은 내가 생각해 낸 것입니다.
function post(path, data, callback) {
"use strict";
var request = new XMLHttpRequest();
if (path === "") {
path = "/";
}
request.open('POST', path, true);
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
request.onload = function (d) {
callback(d.currentTarget.response);
};
request.send(serialize(data));
}
당신은 그렇게 할 수 있습니다 :
post("", {orem: ipsum, name: binny}, function (response) {
console.log(respone);
})
이 부분을 다루는 복제본이 있으며 아무도 그것에 대해 설명하지 않습니다. 설명 된 답변 예제를 빌려 보겠습니다.
http.open('POST', url, true);
http.send('lorem=ipsum&name=binny');
나는 설명을 위해 이것을 지나치게 단순화했다 (나는 http.onload(function() {})
그 대답의 오래된 방법 대신에 사용한다 ). 이것을 그대로 사용하면 서버가 POST 본문을 실제 key=value
매개 변수가 아닌 문자열로 해석하는 것입니다 (예 : PHP는 $_POST
변수를 표시하지 않음 ). 그것을 얻으려면 양식 헤더를 전달 해야합니다.http.send()
http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
URL 인코딩 데이터가 아닌 JSON을 사용하는 경우 application/json
대신 전달하십시오.
이것은 xmlHttpRequest
객체를 양식 데이터로 고수 하고 게시하고 싶을 때 도움이되었습니다 .
function sendData(data) {
var XHR = new XMLHttpRequest();
var FD = new FormData();
// Push our data into our FormData object
for(name in data) {
FD.append(name, data[name]);
}
// Set up our request
XHR.open('POST', 'https://example.com/cors.php');
// Send our FormData object; HTTP headers are set automatically
XHR.send(FD);
}
https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/Sending_forms_through_JavaScript
참고 URL : https://stackoverflow.com/questions/9713058/send-post-data-using-xmlhttprequest
'Programing' 카테고리의 다른 글
타입 스크립트 : 인터페이스와 타입 (0) | 2020.02.14 |
---|---|
git이 항상 특정 브랜치에서 가져 오는 방법은 무엇입니까? (0) | 2020.02.14 |
Python에서“pip”로 psycopg2를 설치하는 방법은 무엇입니까? (0) | 2020.02.14 |
MySQL 데이터베이스의 크기를 얻는 방법? (0) | 2020.02.14 |
Java에서 파일의 MD5 체크섬 가져 오기 (0) | 2020.02.14 |