ESP8266向Blazor Server App发送POST请求返回415错误排查求助
解决ESP8266向Blazor Server API发送POST请求返回415/400错误的问题
看起来你遇到的415(不支持的媒体类型)和400(错误请求)错误,既有ESP客户端代码的明显问题,也可能涉及Blazor Server端的API配置,咱们一步步拆解分析:
一、ESP客户端代码的核心问题
你的代码里有个容易忽略的逻辑错误,直接导致请求头没有被正确应用到POST请求上:
- 请求头添加时机错误:你在
http.GET()调用完成后才执行http.addHeader,这时候GET请求已经发送并结束,后续的POST请求根本不会使用这个头!HTTP客户端在完成一个请求后,内部状态会重置,所以你需要在每个请求(GET/POST是独立请求)发起前单独配置对应的请求头。 - Content-Type匹配问题:如果只是发送纯字符串
hellofromEsp8266,application/x-www-form-urlencoded其实更适合发送key=value格式的键值对,如果你没有构造键值对结构,服务端可能无法解析;而multipart/form-data需要复杂的边界分隔符格式,ESP的POST方法直接传字符串没法生成符合要求的多部分请求,这也是改成它后返回400的原因。
修正后的ESP代码示例
把GET和POST请求拆分为独立的请求流程,确保每个请求都正确配置头:
#include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #include <WiFiClient.h> const String ssid="你的WiFi名称"; const String password="你的WiFi密码"; const String url="http://raspberrypiproject.com/api/values/1"; void setup() { Serial.begin(115200); WiFi.mode(WIFI_STA); WiFi.begin(ssid,password); Serial.println(); Serial.print("Connecting"); while(WiFi.status()!=WL_CONNECTED) { Serial.print("."); delay(500); } Serial.println(); Serial.print("Connected to "); Serial.println(WiFi.SSID()); } void loop() { if(WiFi.status()==WL_CONNECTED) { WiFiClient client; HTTPClient http; // 执行GET请求(如果业务需要的话) if(http.begin(client, url)) { int getCode = http.GET(); if(getCode > 0) { Serial.println("=== GET Response ==="); Serial.println(http.getString()); } else { Serial.print("GET Failed, Code: "); Serial.println(getCode); } http.end(); // 结束GET请求,释放资源 } // 独立执行POST请求 if(http.begin(client, url)) { // 根据服务端API的要求设置Content-Type,这里先假设服务端接受纯文本 http.addHeader("Content-Type", "text/plain"); int postCode = http.POST("hellofromEsp8266"); Serial.print("\nPOST Status Code: "); Serial.println(postCode); if(postCode > 0) { Serial.println("=== POST Response ==="); Serial.println(http.getString()); } else { Serial.print("POST Failed, Code: "); Serial.println(postCode); } http.end(); // 结束POST请求 } delay(5000); // 添加延迟避免频繁请求服务器 } }
二、Blazor Server端的排查要点
415错误本质是服务端不认可你发送的请求媒体类型,所以需要确认API端点的配置:
- 检查API参数绑定方式:如果你的
[HttpPost]方法用了[FromBody]特性,那么服务端通常期望接收application/json格式的数据,这时候ESP需要把数据转成JSON字符串(比如"hellofromEsp8266"),并设置Content-Type: application/json。 - 确认输入格式化器:如果API接收的是字符串类型,要确保服务端配置了支持对应Content-Type的输入格式化器(比如
text/plain或application/x-www-form-urlencoded)。 - 验证端点路由:确认
/api/values/1这个路由确实对应了HttpPost方法,而不是只有HttpGet。
总结
- 先修正ESP客户端的请求逻辑,确保每个请求都在发起前配置正确的Content-Type;
- 根据Blazor Server API的实际要求,调整ESP发送的数据格式和Content-Type,比如:
- 如果API接受JSON:发送
"hellofromEsp8266",设置Content-Type: application/json; - 如果API接受表单:发送
data=hellofromEsp8266,设置Content-Type: application/x-www-form-urlencoded; - 如果API接受纯文本:发送
hellofromEsp8266,设置Content-Type: text/plain。
- 如果API接受JSON:发送
内容的提问来源于stack exchange,提问作者Михаил Димитров
相关产品推荐
相关产品推荐

