如何使用身份验证在 ESP8266 上 POST 到 RESTful API?

How to POST to a RESTful API on an ESP8266 using authentication?

我可以从浏览器输入这个 URL,在输入我的凭据后,这成功调用了我的 API http://172.16.0.40/rest/vars/set/1/12/666.

我正在尝试使用 HTTPClient 从 ESP8266 执行此操作。我的凭据是 username:password,我使用在线转换实用程序获取 dXNlcm5hbWU6cGFzc3dvcmQ=.

执行时,出现以下returns错误701(不知道那是什么)。

HTTPClient http;
http.begin("172.16.0.40", 80, "/");
http.addHeader("Content-Type", "text/plain");
http.addHeader("Authorization", "dXNlcm5hbWU6cGFzc3dvcmQ=");
auto httpCode = http.POST("rest/vars/set/1/12/999");

如果我注释掉授权 header,我会得到 401,这是未经授权的访问。我做错了什么?

这种授权的header必须是这样的(Wikipedia):

Authorization: Basic d2lraTpwZWRpYQ==

简而言之,您可能只是漏掉了 "Basic" 部分。并且需要将您的代码更改为

http.addHeader("Authorization", "Basic dXNlcm5hbWU6cGFzc3dvcmQ=");

您正在尝试使用 rest/vars/set/1/12/999 作为负载向 http://172.16.0.40/ 发出 POST 请求。

HTTP 状态代码 701 不是标准代码,可能是特定于服务器的。

您可能打算这样做:

HTTPClient http;
http.begin("172.16.0.40", 80, "/rest/vars/set/1/12/999");
http.addHeader("Content-Type", "text/plain");
http.addHeader("Authorization", "Basic dXNlcm5hbWU6cGFzc3dvcmQ=");
auto httpCode = http.POST(payload);

如果您想要 GET 请求,请调用 http.GET() 而不是 http.POST(payload),您应该会得到与浏览器内部相同的响应。

编辑:
正如@MaximilianGerhardt 已经回答的那样,您需要将 Basic 添加到您的 Authorization header.