【问题标题】:guru meditation error when reading data from ESPAsyncWebServer request parameters从 ESPAsyncWebServer 请求参数读取数据时出现大师冥想错误
【发布时间】:2020-04-30 11:08:13
【问题描述】:

我正在开发 ESP32,是此设备的新手。

我目前面临以下错误。 当我尝试从 request->value().c_str() 读取数据时,串行监视器向我显示大师冥想错误错误 SS错误:

我的代码:

server.on("/register", HTTP_POST, [](AsyncWebServerRequest *request) {
    request->send(200, "text/plain", Register(request->getParam("plain",true)).c_str());
});

功能:

string Register(AsyncWebParameter *request){

  const size_t bufferSize = JSON_OBJECT_SIZE(1) + 250;;
  StaticJsonDocument<bufferSize>  data;
  deserializeJson(data, request->value().c_str()); // facing issue here when request->value().c_str() is called
  const char* name = data["username"];

  return String("Execution complete");
  }

我已经返回简单的 javascript 函数来调用 API:

function Register() {
const tosend={
      "username":"Mohit",
      "password":"Mohit10#",
      "lastname":"mhatre",
      "firstname":"Mohit"
  };
  const url="http://192.168.2.120/register";
  
  fetch(url, {
    method: 'post',
    headers: {
      // if you want to set
    },
    body: tosend
  })
    .then(
      function(response) {
        response.json().then(function(data) {
          console.log(data);
        });
      }
    )
    .catch(function(err) {
      console.log('Fetch Error :-S', err);
    });
}

谁能帮我解决这个问题,我是新手,昨天就卡在这里了

【问题讨论】:

  • 您不应该在访问之前检查deserializeJson 是否成功并且生成的对象有name 字段吗?
  • 不,反序列化没有运行,只要 request->value().c_str() 被命中就会发生错误@Botje
  • request-&gt;getParam("plain",true) returns nullptr 如果提到的参数不存在。始终检查您的假设request-&gt;hasParam("plain", true)) 并返回值!
  • 是的,谢谢你成功了,参数是空的

标签: c++ esp32


【解决方案1】:

我解决了这个问题。 正如 Botje 在上面的评论中所描述的那样。 问题是 Register(request->getParam("plain",true)).c_str() 返回空结果,所以当我尝试访问它们时,esp 会导致问题。

以下是我所做的代码更改:

服务器代码:

  server.on("/register", HTTP_POST, [](AsyncWebServerRequest *request){request->send(200, "text/plain", "");}, NULL, Register);

功能

void Register(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total)
{
  chipid=ESP.getEfuseMac();

  StaticJsonDocument<200> doc;
  deserializeJson(doc, data);

  doc["device_id"] = (uint16_t)(chipid>>32)+(uint32_t)chipid;

  char jsonBuffer[512];
  serializeJson(doc, jsonBuffer);
  // used the json as required.     
}

【讨论】:

    猜你喜欢
    • 2016-02-27
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多