首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arduino C++将http客户端初始化移动到一个函数中。

Arduino C++将http客户端初始化移动到一个函数中。
EN

Stack Overflow用户
提问于 2022-07-05 16:43:40
回答 2查看 107关注 0票数 0

我正在做一个ESP-01 (ESP8266板)项目,并发出一些HTTP请求。我试图重构我的代码,以保持它的干燥,但我仍然停留在如何将http客户端初始化提取到一个函数上。

以下是我工作的PUT请求功能:

代码语言:javascript
复制
void httpPut(const char* url, const char* data) {
  WiFiClient client;
  HTTPClient http;

  http.begin(client, url);
  http.addHeader("Content-Type", "application/json");
  http.PUT(data);

  http.end();
}

我的想法是做一个这样的功能:

代码语言:javascript
复制
HTTPClient prepareRequest(const char* url) {
  WiFiClient client;
  HTTPClient http;

  http.begin(client, url);
  http.addHeader("Content-Type", "application/json");
  return http;
}

并在我的所有请求函数中使用,如下所示:

代码语言:javascript
复制
void httpGet(const char* url) {
  HTTPClient http = prepareRequest(url);
  http.GET();
  http.end();
}

我得到了这个编译器错误,但我不太确定它意味着什么(第90行提到的是return http;):

代码语言:javascript
复制
/home/<user>/Code/Micro/mittari-micro/src/mittari.ino: In function 'HTTPClient prepareRequest(const char*)':
/home/<user>/Code/Micro/mittari-micro/src/mittari.ino:90:10: error: use of deleted function 'HTTPClient::HTTPClient(const HTTPClient&)'
   90 |   return http;
      |          ^~~~
In file included from /home/<user>/Code/Micro/mittari-micro/src/mittari.ino:2:
/home/<user>/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h:151:7: note: 'HTTPClient::HTTPClient(const HTTPClient&)' is implicitly deleted because the default definition would be ill-formed:
  151 | class HTTPClient
      |       ^~~~~~~~~~
/home/<user>/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h:151:7: error: use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = StreamString; _Dp = std::default_delete<StreamString>]'
In file included from /home/<user>/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/10.3.0/memory:83,
                 from /home/<user>/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h:28,
                 from /home/<user>/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.h:28,
                 from /home/<user>/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/ESP8266WiFi.h:34,
                 from /home/<user>/Code/Micro/mittari-micro/src/mittari.ino:1:
/home/<user>/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/10.3.0/bits/unique_ptr.h:468:7: note: declared here
  468 |       unique_ptr(const unique_ptr&) = delete;
      |       ^~~~~~~~~~

是否有可能将通用功能提取到函数中,我如何才能做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-05 17:11:51

您正在尝试在HTTPClient函数的末尾按值返回一个prepareRequest对象(http)。在这种情况下,这意味着复制构造,编译器告诉您,此类的复制构造是故意禁用的。(这可能有很多原因。)

在Arduino环境中这样做通常是将"WiFiClient客户端“和"HTTPClient http”移动到全局范围。然后将您的初始化代码写入"setup“函数中,最后您可以在任何您喜欢的函数中使用它们。这样,您就可以将URL和头的设置分离到"prepareRequest“函数中--实际的http进入"httpGet”函数,而不需要它们返回任何内容。

有更复杂的解决方案,包括const引用、指针等。但除非你特别想走这条路,否则我会支持上面提到的解决方案。

票数 2
EN

Stack Overflow用户

发布于 2022-07-05 19:54:24

我将WiFiClient和HTTPClient放在全局范围内,并将准备方法更改为无效,如下所示:

代码语言:javascript
复制
WiFiClient client;
HTTPClient http;

void prepareRequest(const char* url) {
  http.end(); // In case previous request did not call end for some reason.
  http.begin(client, url);
  http.addHeader("Content-Type", "application/json");
}

void httpGet(const char* url) {
  prepareRequest(url);
  http.GET();
  http.end();
}

到目前为止似乎还不错。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72872925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档