我試圖從ESP32上的http服務器接收json資料,但每次我試圖訪問json里面的資料時都會出現核心恐慌。 POST請求是通過簡單的HTML表單完成的:
<form method="post" enctype='text/plain'>
<fieldet>
<legend>發酵:</legend>
<input name="type" type="radio" value="al" /> Ale <br />
<input checked="checked" name="type" type="radio" value="Lager" /> Lager <br />
<標簽 for="primary-duration">初級的持續時間</label><br />
<input name="primary-duration" type="text" value="5" /> <br />
<input type="submit" value="submit"><br />
</fieldset>
</form>
char *buf包含來自POST的資料,像這樣。type=Lager primary-duration=5
在將資料讀入buf后,我正在使用cJSON對其進行決議
cJSON *root = cJSON_Parse(buf);
并提取 "型別 "物件
。const cJSON *typeJSON = cJSON_GetObjectItemCaseSensitive(root, "type") 。
在得到我的cJSON物件后,它被_IsString()正確地識別為一個字串,但當我試圖訪問它時得到 "LoadProhibited "的恐慌。
if (cJSON_IsString(typeJSON) & & (typeJSON-> valuestring != NULL)
{
printf("%s", typeJSON->valuetring)。
}else if(cJSON_IsString(typeJSON))。
{
ESP_LOGE(SERVER_HANDLER_TAG, "String error: 不是一個字串")。)
}else; }else?
{
ESP_LOGE(SERVER_HANDLER_TAG, "String error: empty string"); //I am always here, trying to print string (typeJSON-> valuestring) results in kernel panic.
}
如果有任何建議,我將會非常感激。
uj5u.com熱心網友回復:
你的<form>有屬性enctype='text/plain';這意味著POST主體將不包含JSON編碼的資料。
的確,字串"type=Lager primary-duration=5"不是有效的JSON。
不幸的是,enctype='application/json'不可用,所以你必須手動序列化form的欄位,然后用JSON資料進行POST請求。
例如:
<form action="javascript:void(0); "/span>>
< input type="text" id="mytext1" />
<button onclick="submitData()" > 提交</按鈕>
</form>/span>
<script>
async function submitData(){
const mytext1 = document.getElementById("mytext1"/span>).value;
const body = { mytext1 };
const response = await fetch("target_page"/span>, {
method: "POST"。
headers: {
"Content-Type": "application/json"。
},
body: JSON.stringify(body)
});
//如果你的服務器回應的是文本。
const serverResponse = await response.text()。
...
}
</script>
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/322470.html
標籤:
下一篇:當列>行時,轉置矩陣給我帶來錯誤
