You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mongoose嵌入式Web服务器URL参数获取及表单跳转问题

解决Mongoose中获取URL GET参数及表单跳转问题

我来帮你搞定这个问题!首先咱们理清两个核心问题:表单提交的路径规范和Mongoose中获取GET参数的正确姿势。

问题根源分析

  1. 表单Action路径(小细节但需规范):你的表单action="sum"在当前/api/hello的上下文下确实会跳转到/api/sum,逻辑本身没问题,但为了避免路径歧义,建议写成绝对路径action="/api/sum"更稳妥。
  2. 参数获取逻辑完全错误:你用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参数,具体步骤如下:

  1. 从struct mg_http_message的query字段获取参数字符串(GET参数都存在这里)
  2. 用mg_http_get_var提取指定名称的参数值
  3. 将提取到的文本参数转换成数字(因为表单输入是文本类型)

修改后的代码示例

替换你原来的/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 16:25:15