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
属性中包含某些内容。
我在 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
属性中包含某些内容。