I am working on a tool for generating html files. The code is fairly simple. A user clicks a post button and the content from a textarea is sent to an endpoint. I have tried posting the html as a json string.
Expected The saveContent method is called. The value from the textarea element is concatenated into a string. This string is the json that is sent to the server. Once the request is completed a 201 response should come back.
Actual The saveContent method is called. The value from the textarea element is concatenated into a string. This string is the json that is sent to the server. A 400 response comes back.
Here is an example of the string
{"content":"<div id="maincontentstyle">
<center>
<div id="boxstyle">
<h3 id="title">title</h3>
<center>
<div class="source">
<div id="s1" class="draggyBox-small">
k1
</div>
<div id="s2" class="draggyBox-small">
k2
</div>
</div>
</center>
<table id="tablestyle">
<tr>
<td id="row1">
<div id="t1" class="ltarget"></div>
</td >
<td id="d1">
d1
</td >
</tr>
<tr>
<td id="row2">
<div id="t2" class="ltarget"></div>
</td >
<td id="d2">
d2
</td >
</tr>
</table>
</center>
</div>
</center>
</div>"}
This is the saveContent method
function saveContent(){
console.log("calling save content");
var html_content = document.getElementById("generated_html_textarea");
var xhr = new XMLHttpRequest();
xhr.open("POST", "/wordmatch", true);
xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
xhr.onreadystatechange = function()
{
if(xhr.readyState == 4 && xhr.status == 201) {
console.log("content saved");
}
else{
console.log("content was not save successfully");
}
}
console.log('{"content":"'
+html_content.value+'"}');
xhr.send('{"content":"'
+html_content.value+'"}');
}
Advertisement
Answer
Don’t create JSON by concatenating strings. You’re not properly escaping all the nested quotes, converting newlines to n
, etc.
Use JSON.stringify()
on a JavaScript object:
xhr.send(JSON.stringify({content: html_content.value}));