Mongoose嵌入式Web服务器URL参数获取及表单跳转问题
解决Mongoose中获取URL GET参数及表单跳转问题
我来帮你搞定这个问题!首先咱们理清两个核心问题:表单提交的路径规范和Mongoose中获取GET参数的正确姿势。
问题根源分析
- 表单Action路径(小细节但需规范):你的表单
action="sum"在当前/api/hello的上下文下确实会跳转到/api/sum,逻辑本身没问题,但为了避免路径歧义,建议写成绝对路径action="/api/sum"更稳妥。 - 参数获取逻辑完全错误:你用
mg_json_get_num解析hm->body是不对的——GET请求的参数根本不在请求体(body)里,而是附在URL的query部分(比如/api/sum?number1=1&number2=2),而且GET参数是键值对格式,不是JSON数组,用JSON解析函数完全不匹配。
正确解决方案
Mongoose提供了专门的mg_http_get_var函数来提取URL中的GET参数,具体步骤如下:
- 从
struct mg_http_message的query字段获取参数字符串(GET参数都存在这里) - 用
mg_http_get_var提取指定名称的参数值 - 将提取到的文本参数转换成数字(因为表单输入是文本类型)
修改后的代码示例
替换你原来的/api/sum分支逻辑,改成下面这样:
else if(mg_http_match_uri(hm, "/api/sum")) { char num1_str[32] = {0}, num2_str[32] = {0}; // 从query中提取number1和number2参数 mg_http_get_var(&hm->query, "number1", num1_str, sizeof(num1_str)); mg_http_get_var(&hm->query, "number2", num2_str, sizeof(num2_str)); // 检查参数是否有效并转换为数字 if (strlen(num1_str) > 0 && strlen(num2_str) > 0) { double num1 = atof(num1_str); double num2 = atof(num2_str); mg_http_reply(c, 200, "Content-Type: text/plain\r\n", "result:%g\n", num1 + num2); } else { mg_http_reply(c, 400, "Content-Type: text/plain\r\n", "Parameters Missing or Invalid"); } }
同时,把表单的action改成绝对路径,彻底避免路径歧义:
<form action="/api/sum" method="GET">
关键知识点解释
hm->query:Mongoose中,GET请求的参数存储在struct mg_http_message的query字段里,而body是留给POST请求的请求体内容的。mg_http_get_var:这个函数专门用来从URL参数字符串中提取指定键的值,参数依次是:参数字符串指针、要提取的键名、存储值的缓冲区、缓冲区大小。- 参数校验:用
strlen检查提取到的字符串是否为空,避免转换空字符串导致的错误;用atof把文本转换成浮点数,如果需要整数可以用atoi。
这样修改后,你的表单提交就能正确跳转到/api/sum并获取参数计算结果了。
内容的提问来源于stack exchange,提问作者Anusha
相关产品推荐
相关产品推荐

