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

ESP8266软AP模式下WebServer读取路径后消息的方法求助

解决ESP8266WebServer读取完整请求内容的问题

嘿,你碰到的问题是因为ESP8266WebServer库已经帮你封装了客户端连接的处理,它并没有available()方法——这个方法属于WiFiServer类,和WebServer的用法完全不一样。下面给你几种常用的方式来读取请求的完整内容:

1. 获取完整的请求路径(包括根路径后的部分)

如果你想获取用户访问的完整URI(比如/sensor/data?id=1这种),可以直接用server.uri()方法。我们可以创建一个通用处理器来处理所有路径,也可以指定特定路径:

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

const char *ssid = "test";
const char *password = "password";
ESP8266WebServer server(80);

// 处理所有路径的请求
void handleAllRequests() {
  // 获取完整的请求URI
  String fullRequestPath = server.uri();
  // 获取请求方法(GET/POST等)
  String requestMethod = server.methodToString(server.method());
  
  // 把路径返回给客户端看效果
  server.send(200, "text/plain", "你请求的完整路径是: " + fullRequestPath + "\n请求方法: " + requestMethod);
  
  // 也可以在串口打印出来
  Serial.print("收到请求: ");
  Serial.println(fullRequestPath);
}

void setup() {
  delay(1000);
  Serial.begin(115200);
  Serial.println();
  
  Serial.print("配置接入点...");
  WiFi.softAP(ssid, password);
  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP地址: ");
  Serial.println(myIP);
  
  // 用这个处理器处理所有未匹配的路径
  server.onNotFound(handleAllRequests);
  // 也可以指定特定路径,比如/server/data,然后在处理器里拿uri
  // server.on("/server/data", handleAllRequests);
  
  server.begin();
  Serial.println("HTTP服务器已启动");
}

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

2. 读取POST请求的请求体内容

如果是客户端发送POST请求并携带请求体(比如JSON、表单数据),可以用server.arg("plain")来读取原始的请求体内容:

void handlePostRequest() {
  if (server.method() == HTTP_POST) {
    String requestBody = server.arg("plain");
    Serial.print("POST请求体内容: ");
    Serial.println(requestBody);
    
    server.send(200, "text/plain", "已收到POST内容: " + requestBody);
  } else {
    server.send(405, "text/plain", "只接受POST请求");
  }
}

// 在setup函数里添加这个路径处理
server.on("/submit", handlePostRequest);

3. 读取GET请求的查询参数

如果是GET请求带参数(比如/query?temp=25&hum=60),可以用server.arg("参数名")来获取单个参数:

void handleQueryRequest() {
  String temp = server.arg("temp");
  String hum = server.arg("hum");
  
  String response = "温度: " + temp + "℃\n湿度: " + hum + "%";
  server.send(200, "text/plain", response);
  
  Serial.print("温度参数: ");
  Serial.println(temp);
}

// 在setup函数里添加
server.on("/query", handleQueryRequest);

总结一下,ESP8266WebServer已经帮你处理了客户端连接和HTTP请求的解析工作,你不需要手动调用available()或者readStringUntil(),直接用库提供的uri()、arg()这些方法就能轻松获取请求的所有内容啦。

内容的提问来源于stack exchange,提问作者Tabish Saifullah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:50:08