server.arg("plain") 在某些情况下在 ESP8266 Web 服务器中不起作用

server.arg("plain") is not working in some cases in ESP8266 Webserver

我在 ESP8266-Webserver-example 列表中找到了一个 post 服务器示例。然后我修改它以满足我的需要。我编写了自己的 HTML 代码并将该站点托管在我的 ESP8266 中。代码是:

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

#ifndef STASSID
#define STASSID "ssid"
#define STAPSK  "pass"
#endif

const char* ssid     = STASSID;
const char* password = STAPSK;

ESP8266WebServer server(80);

const int led = LED_BUILTIN;

const String postForms = "";


void handleRoot() {
  digitalWrite(led, 1);
  server.send(200, "text/html", postForms);
  digitalWrite(led, 0);
}

void handlePlain() {
  if (server.method() != HTTP_POST) {
    digitalWrite(led, 1);
    server.send(405, "text/plain", "Method Not Allowed");
    digitalWrite(led, 0);
  } else {
    digitalWrite(led, 1);
    server.send(200, "text/plain", "POST body was:\n" + server.arg("plain"));
    digitalWrite(led, 0);
  }
}

void setup(void) {
  pinMode(led, OUTPUT);
  digitalWrite(led, 0);
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  if (MDNS.begin("esp8266")) {
    Serial.println("MDNS responder started");
  }

  server.on("/", handleRoot);

  server.on("/postplain/", handlePlain);

  server.begin();
  Serial.println("HTTP server started");
}

void loop(void) {
  server.handleClient();
}

当我在 postForms 字符串中输入此 HTML 代码时,我得到了正确的输出。 这里:

<html>

<head>

<title>ESP8266 Web Server POST handling</title>

<style>

body { background-color: cyan; font-family: Arial; Color: Black}

</style>

</head>

<body>

<h1>Let us know what you think!</h1><br>

<form method="post" enctype="text/plain" action="/postplain/" >

<input type="text" name="Comment:" value=""><br>
<input type="submit" value="Submit">

</form>

使用上述HTML代码提交“Hello”后的输出:

POST body was:
Comment:=Hello

但是当我在 HTML 代码中使用 <textarea> 元素而不是 <input> 元素时:

<html>

<head>

<title>ESP8266 Web Server POST handling</title>

<style>

body { background-color: cyan; font-family: Arial; Color: Black}

</style>

</head>

<body>

<h1>Let us know what you think!</h1><br>

<form method="post" enctype="text/plain" action="/postplain/" >
<textarea rows = "10" cols = "60">Hello</textarea> <br><br><br>
<input type="submit">

</form>

则输出为:

POST body was:

使用 <textarea> 元素,server.arg("plain") 函数不打印输入值。 难道我做错了什么?任何帮助表示赞赏。

谢谢!

经过一段时间的尝试,我自己找到了问题的答案。我需要在 <textarea> 元素中添加 name 属性,如下所示:<textarea rows = "10" cols = "60" name = "somewhat_name">Hello</textarea>

server.arg() 函数的实现似乎有点奇怪,它不会 return 输入值,除非 <input><textarea> 元素name 属性中包含某些内容。