[html] HTML 양식 데이터를 사용하여 JSON 객체를 보내는 방법

그래서이 HTML 형식이 있습니다.

<html>
<head><title>test</title></head>
<body>
    <form action="myurl" method="POST" name="myForm">
        <p><label for="first_name">First Name:</label>
        <input type="text" name="first_name" id="fname"></p>

        <p><label for="last_name">Last Name:</label>
        <input type="text" name="last_name" id="lname"></p>

        <input value="Submit" type="submit" onclick="submitform()">
    </form>
</body>
</html>

사용자가 제출을 클릭 할 때이 양식의 데이터를 JSON 개체로 내 서버에 보내는 가장 쉬운 방법은 무엇입니까?

업데이트 : 나는 이것까지 갔지만 작동하지 않는 것 같습니다.

<script type="text/javascript">
    function submitform(){
        alert("Sending Json");
        var xhr = new XMLHttpRequest();
        xhr.open(form.method, form.action, true);
        xhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
        var j = {
            "first_name":"binchen",
            "last_name":"heris",
        };
        xhr.send(JSON.stringify(j));

내가 뭘 잘못하고 있죠?



답변

완전한 양식 데이터를 배열로 가져오고 json을 문자열 화하십시오.

var formData = JSON.stringify($("#myForm").serializeArray());

나중에 ajax에서 사용할 수 있습니다. 또는 ajax를 사용하지 않는 경우; 숨겨진 텍스트 영역에 넣고 서버로 전달하십시오. 이 데이터가 일반 형식 데이터를 통해 json 문자열로 전달되면 json_decode를 사용하여 디코딩해야합니다 . 그런 다음 모든 데이터를 배열로 가져옵니다.

$.ajax({
  type: "POST",
  url: "serverUrl",
  data: formData,
  success: function(){},
  dataType: "json",
  contentType : "application/json"
});


답변

HTML은 양식 데이터에서 JSON을 생성하는 방법을 제공하지 않습니다.

클라이언트에서 실제로 처리하려면 JavaScript를 사용하여 다음을 수행해야합니다.

  1. DOM을 통해 양식에서 데이터 수집
  2. 객체 또는 배열로 구성
  3. JSON.stringify로 JSON 생성
  4. XMLHttpRequest로 게시

application/x-www-form-urlencoded데이터를 고수하고 JSON 대신 서버에서 처리하는 것이 더 나을 것입니다 . 양식에는 JSON 데이터 구조의 이점을 얻을 수있는 복잡한 계층 구조가 없습니다.


질문의 주요 재 작성에 대한 응답으로 업데이트…

  • JS에는 readystatechange핸들러 가 없으므로 응답으로 아무것도하지 않습니다.
  • 기본 동작을 취소하지 않고 제출 버튼을 클릭하면 JS를 트리거합니다. 브라우저는 JS 기능이 완료되는 즉시 양식을 (정기적으로) 제출합니다.

답변

코드는 괜찮지 만 실행되지 않았습니다. 제출 버튼의 원인 [type = “submit”] 그냥 type = button으로 대체 하세요.

<input value="Submit" type="button" onclick="submitform()">

스크립트 내부;
양식 이 선언되지 않았습니다.

let form = document.forms[0];
xhr.open(form.method, form.action, true);


답변

나는 늦었지만 객체가 필요한 사람들을 위해 html만을 사용하는 방법이 있다고 말할 필요가 있습니다. PHP와 같은 일부 서버 측 프레임 워크에서는 다음 코드를 작성할 수 있습니다.

<form action="myurl" method="POST" name="myForm">
        <p><label for="first_name">First Name:</label>
        <input type="text" name="name[first]" id="fname"></p>

        <p><label for="last_name">Last Name:</label>
        <input type="text" name="name[last]" id="lname"></p>

        <input value="Submit" type="submit">
    </form>

그래서 우리 object[property]는 객체를 얻기 위해 입력의 이름을 설정해야 합니다. 위의 예에서 우리는 다음 JSON을 가진 데이터를 얻었습니다.

{
"name": {
  "first": "some data",
  "last": "some data"
 }
}


답변

다음과 같이 시도 할 수 있습니다.

<html>
<head>
    <title>test</title>
</head>

<body>
    <form id="formElem">
        <input type="text" name="firstname" value="Karam">
        <input type="text" name="lastname" value="Yousef">
        <input type="submit">
    </form>
    <div id="decoded"></div>
    <button id="encode">Encode</button>
    <div id="encoded"></div>
</body>
<script>
    encode.onclick = async (e) => {
        let response = await fetch('http://localhost:8482/encode', {
                method: 'GET',
                headers: {
                    'Content-Type': 'application/json',
                },
        })

        let text = await response.text(); // read response body as text
        data = JSON.parse(text);
        document.querySelector("#encoded").innerHTML = text;
      //  document.querySelector("#encoded").innerHTML = `First name = ${data.firstname} <br/> 
      //                                                  Last name = ${data.lastname} <br/>
      //                                                  Age    = ${data.age}`
    };

    formElem.onsubmit = async (e) => {
      e.preventDefault();
      var form = document.querySelector("#formElem");
     // var form = document.forms[0];

        data = {
          firstname : form.querySelector('input[name="firstname"]').value,
          lastname : form.querySelector('input[name="lastname"]').value,
          age : 5
        }

        let response = await fetch('http://localhost:8482/decode', {
                method: 'POST', // or 'PUT'
                headers: {
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify(data),
        })

        let text = await response.text(); // read response body as text
        document.querySelector("#decoded").innerHTML = text;
    };
</script>
</html>


답변