django 异步/等待获取text/html的POST参数

vu8f3i0k  于 12个月前  发布在  Go
关注(0)|答案(2)|浏览(82)

如何为text/html内容类型POSTPOST参数,而不将其作为对象发送?
在我的情况下,我需要发送额外的数据以外的形式从cookie读取。
使用body : {}body: JSON.Stringify({})发布数据对象。我希望数据作为单独的值发布。

$(document).on('click', '#update', async () => {
    try {
        const response = await fetch("/getupdate",{
            method:'POST',
            headers:{
                'Content-Type':'text/html; charset=utf-8'
            },
            body: JSON.stringify({
                "country": getCookie("country"),
                "city": getCookie("city").replace(/"/g, ""),
                "action": 1,
                "csrfmiddlewaretoken": $('input[name=csrfmiddlewaretoken]').val()
            }),
        });
    } catch (error){
        console.log(error)
    }
});

字符串
得到一个对象而不是单个值-

{
    "country": "US",
    "city": "Miami",
    "action": 1,
    "csrfmiddlewaretoken": "iLoS4Bsgdyc6EhOtQKiiXrIqr9S1eojdhdyEeClA8qI5ei2WpfQQu1JrduLrbndndR"
}


期望个人价值观-

"country": "US",
    "city": "Miami",
    "action": 1,
    "csrfmiddlewaretoken": "iLoS4Bsgdyc6EhOtQKiiXrIqr9S1eojdhdyEeClA8qI5ei2WpfQQu1JrduLrbndndR"

sy5wg1nm

sy5wg1nm1#

添加我的评论作为答案,因为你提到你想提交一个form-data。你已经构造了FormData,而不是JsonString

$(document).on('click', '#update', async () => {
    try {
        // Construct form data
        const data = new FormData();
        data.append("country", getCookie("country"));
        data.append("city", getCookie("city").replace(/"/g, ""));
        data.append("action", 1);
        data.append("csrfmiddlewaretoken", $('input[name=csrfmiddlewaretoken]').val());

        const response = await fetch("/getupdate",{
            method:'POST',
            body: data,
        });
    } catch (error){
        console.log(error)
    }
});

字符串

wbgh16ku

wbgh16ku2#

如果你对以JSON字符串/对象的形式发送数据不感兴趣,可以有其他的选择。这里我有三个例子。发送为:

  • text/pain
  • application/x-www-form-urlencoded
  • multipart/form-data

发送内容类型为text/html的数据没有意义,因为数据与HTML代码无关。
我更倾向于使用第二种或第三种选择。

以text/plain格式发送(URI编码)

这就是我对你的问题的解释。你想把数据作为一个普通的字符串发送。现在,这有点混乱,有换行符和字符,如",所以你需要encode the data as URI。在这种情况下,服务器没有机会解释数据/字符串,因此这个选项不是一个好主意。

$(document).on('click', '#update', async() => {
  let data = `"country": ${getCookie("country")},
              "city": ${getCookie("city").replace(/"/g, "")},
              "action": 1,
              "csrfmiddlewaretoken": ${$('input[name=csrfmiddlewaretoken]').val()}`;

  try {
    const response = await fetch("/getupdate", {
      method: 'POST',
      body: encodeURIComponent(data)
    });
  } catch (error) {
    console.log(error)
  }
});

function getCookie(str) {
  return "some string";
}

个字符

以application/x-www-form-urlencoded格式发送

这是使用普通HTML表单POST数据时的默认内容类型。如果没有需要发送的文件,这将是首选选项。服务器将能够解释数据,就像它是发送数据的HTML表单一样。

$(document).on('click', '#update', async() => {
  let data = new URLSearchParams();
  data.append('country', getCookie("country"));
  data.append('city', getCookie("city").replace(/"/g, ""));
  data.append('action', 1);
  data.append('csrfmiddlewaretoken', $('input[name=csrfmiddlewaretoken]').val());

  try {
    const response = await fetch("/getupdate", {
      method: 'POST',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
      },
      body: data
    });
  } catch (error) {
    console.log(error)
  }
});

function getCookie(str) {
  return "some string";
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input name="csrfmiddlewaretoken" value="csrfmiddlewaretoken">
<button id="update">Update</button>

的字符串

以multipart/form-data格式发送

这是当您POST数据时使用的内容类型,包括HTML表单中的文件。服务器将能够解释数据,就像它是发送数据的HTML表单一样。

$(document).on('click', '#update', async() => {
  try {
    let data = new FormData();
    data.append("country", getCookie("country"));
    data.append("city", getCookie("city").replace(/"/g, ""));
    data.append("action", 1);
    data.append("csrfmiddlewaretoken", $('input[name=csrfmiddlewaretoken]').val());

    const response = await fetch("/getupdate", {
      method: 'POST',
      body: data
    });
  } catch (error) {
    console.log(error)
  }
});

function getCookie(str) {
  return "some string";
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input name="csrfmiddlewaretoken">
<button id="update">Update</button>

相关问题