Fetch API로 양식 데이터를 게시하려면 어떻게합니까?
내 코드 :
fetch("api/xxx", {
body: new FormData(document.getElementById("form")),
headers: {
"Content-Type": "application/x-www-form-urlencoded",
// "Content-Type": "multipart/form-data",
},
method: "post",
}
나는 fetch api를 사용하여 내 양식을 게시하려고 시도했으며 보내는 본문은 다음과 같습니다.
-----------------------------114782935826962
Content-Disposition: form-data; name="email"
test@example.com
-----------------------------114782935826962
Content-Disposition: form-data; name="password"
pw
-----------------------------114782935826962--
(왜 전송할 때마다 경계의 숫자가 바뀌는 지 모르겠습니다 ...)
"Content-Type": "application / x-www-form-urlencoded"와 함께 데이터를 전송하고 싶습니다. 어떻게해야합니까? 또는 처리해야하는 경우 컨트롤러에서 데이터를 어떻게 디코딩합니까?
내 질문에 누구에게 대답하는지, 나는 다음과 같이 할 수 있다는 것을 알고 있습니다.
fetch("api/xxx", {
body: "email=test@example.com&password=pw",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
method: "post",
}
내가 원하는 것은 jQuery의 $ ( "# form"). serialize () (jQuery를 사용하지 않고) 또는 컨트롤러에서 mulitpart / form-data를 디코딩하는 방법입니다. 그래도 답변 주셔서 감사합니다.
MDNFormData
을 인용하려면 (강조) :
이
FormData
인터페이스는 양식 필드와 해당 값을 나타내는 키 / 값 쌍 세트를 쉽게 구성 할 수있는 방법을 제공합니다. 그런 다음XMLHttpRequest.send()
메소드를 사용하여 쉽게 전송할 수 있습니다 . 인코딩 유형이로 설정된 경우 양식에서 사용하는 것과 동일한 형식을 사용합니다"multipart/form-data"
.
사용하는 경우 그래서 FormData
당신은 자신에 고정되어있다 multipart/form-data
. 송신 할 수있는 방법이 없다 FormData
몸으로 개체를하고 있지 에서 보내는 데이터를 multipart/form-data
포맷.
데이터를 전송하려면 application/x-www-form-urlencoded
본문을 URL 인코딩 문자열로 지정하거나 URLSearchParams
객체를 전달해야 합니다. 후자는 안타깝게도 form
요소 에서 직접 초기화 할 수 없습니다 . 양식 요소를 직접 반복하지 않으려면 (을 사용하여 수행 할 수 있음HTMLFormElement.elements
) URLSearchParams
객체에서 객체를 만들 수도 있습니다 FormData
.
const data = new URLSearchParams();
for (const pair of new FormData(formElement)) {
data.append(pair[0], pair[1]);
}
fetch(url, {
method: 'post',
body: data,
})
.then(…);
Content-Type
헤더를 직접 지정할 필요는 없습니다 .
주석에서 monk-time 으로 언급했듯이 루프에 값을 추가하는 대신 객체를 직접 만들고 URLSearchParams
전달할 수도 있습니다 FormData
.
const data = new URLSearchParams(new FormData(formElement));
그래도 브라우저에서 일부 실험적인 지원이 있으므로 사용하기 전에 제대로 테스트해야합니다.
고객
컨텐츠 유형 헤더를 설정하지 마십시오.
// Build formData object.
let formData = new FormData();
formData.append('name', 'John');
formData.append('password', 'John123');
fetch("api/SampleData",
{
body: formData,
method: "post"
});
섬기는 사람
Use the FromForm
attribute to specify that binding source is form data.
[Route("api/[controller]")]
public class SampleDataController : Controller
{
[HttpPost]
public IActionResult Create([FromForm]UserDto dto)
{
return Ok();
}
}
public class UserDto
{
public string Name { get; set; }
public string Password { get; set; }
}
You can set body
to an instance of URLSearchParams
with query string passed as argument
fetch("/path/to/server", {
method:"POST"
, body:new URLSearchParams("email=test@example.com&password=pw")
})
document.forms[0].onsubmit = async(e) => {
e.preventDefault();
const params = new URLSearchParams([...new FormData(e.target).entries()]);
// fetch("/path/to/server", {method:"POST", body:params})
const response = await new Response(params).text();
console.log(response);
}
<form>
<input name="email" value="test@example.com">
<input name="password" value="pw">
<input type="submit">
</form>
참고URL : https://stackoverflow.com/questions/46640024/how-do-i-post-form-data-with-fetch-api
'Programing' 카테고리의 다른 글
AngularJs 복잡한 데이터를 지시문에 전달 (0) | 2020.10.24 |
---|---|
pandas에 동시에 여러 열 추가 (0) | 2020.10.24 |
jaxb / Maven에게 여러 스키마 패키지를 생성하도록 어떻게 알릴 수 있습니까? (0) | 2020.10.24 |
대상 Google API와 대상 Android의 차이점 (0) | 2020.10.24 |
HTTP API 속도 제한 HTTP 응답 헤더의 예 (0) | 2020.10.24 |