使用正则表达式从服务器回复中删除 HTML header

我有一个带有集成 GSM 单元的 ESP32 T-CALL 并使用 这个 作为 Arduino IDE 的基础。

我的代码进行了一个服务器调用并处理结果。 这段代码从缓冲区中读取并将其输出到一个字符串中。 它使用手动生成的 POST 标头,串行发送。 但是,我需要删除 HTTP 标头,仅留下 JSON。

while (client.connected() && millis() - timeout < 10000L) {
  // Print available data (HTTP response from server)
  while (client.available()) {
    char c = client.read();
    returnString += c;
    timeout = millis();
  }
}

输出带有完整的 header,如下所示:

HTTP/1.1 200 OK
Content-Type: application/json
Server: Microsoft-IIS/10.0
X-Powered-By: PHP/8.0.0
X-Powered-By: ASP.NET
Date: Tue, 25 Jan 2022 00:12:31 GMT
Connection: close
Content-Length: 23

{"status:":"code6"}

我使用了 <regexp.h> 库 by Nick Gammon 和这里的 Lua-reference 以过滤掉左大括号之外的所有内容 - 但是,我似乎无法做到。 我想,像这样:

char result = ms.Match ("{(%x+)"); //查找第一个大括号并仅包括右侧的内容。

可惜,使用这个正则表达式,找不到匹配项。 我还尝试在 \r\n\r\n 处分割,在这里使用 getValue-function 但无法接受双行换行符。

如何使用正则表达式删除标头的任何想法?

原文链接 https://stackoverflow.com/questions/70910855

点赞
stackoverflow用户4902099
stackoverflow用户4902099

这不是一个关于如何使用正则表达式的直接答案,但是如果你想跳过头部并获取有效载荷,除了使用我在评论中提到的正则表达式或httpclient库之外,没有使用任何库也不难实现此目的。

要跳过头部并获取有效载荷,您需要修改代码以查找头部的结尾。


// 跳过 http 头部
while (client.connected()) {
  String line = client.readStringUntil('\n');
  if (line == '\r') break;    //如果line只包含" \r",那么它就是头部的末尾
  }
}

// 获取有效载荷
String payload;
while (client.available()) {
  payload = client.readStringUntil('\n');
}

然后,您可以使用JSON库从JSON对象中提取数据。或者,对于您所显示的简单JSON对象,您可以不使用库进行操作。

payload.trim();                  // 去除结尾的 "\r\n"
payload.replace("status:", "");  // 用 "" 替换 "status:"
payload.replace("\"", "");       // 去除所有 "\""
payload.trim();
Serial.println(payload);

这将打印出您JSON对象中 code6 的值。

2022-01-30 02:01:36