내 코드 :
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"
});
섬기는 사람
FromForm
속성을 사용하여 바인딩 소스가 양식 데이터임을 지정 하십시오 .
[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; }
}
답변
인수로 전달 된 쿼리 문자열 body
을 URLSearchParams
사용 하여의 인스턴스로 설정할 수 있습니다.
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>
답변
FormData
및 사용 하여 fetch
데이터 수집 및 전송
답변
function card(fileUri) {
let body = new FormData();
let formData = new FormData();
formData.append('file', fileUri);
fetch("http://X.X.X.X:PORT/upload",
{
body: formData,
method: "post"
});
}