ESP8266 - Server.on - handler mit Parameter aufrufen

Hallo,

ist es Möglich beim server.on - handler einen Parameter mitzugeben?
Wenn ja wie?

Ich bekomme da immer eine Fehlermeldung.

Vielen Dank

server.on("/", handleRequest(MAIN_page));
void handleRequest(String sValue) {
server.send(200, "text/html", sValue);
}

Was sagt die Fehlermeldung? Gibt es den server?

Die Fehlermeldung:

Server läuft, wenn ich es so mache funktionierts...

server.on("/", handleRoot);
void handleRoot() {
 String s = MAIN_page;
 server.send(200, "text/html", s);
}

Ich würde gern die handler-Funktionen zusammenfassen zu einer da müsste ich aber ein Parameter übergeben... das will er irgendwie nicht.

warum?
Was willst du der Funktion mitgeben die gemeinsame Funktion nicht selber wüsste?

edit: grad nachgesehen, es gibt auch ein

const String& uri() const { return _currentUri; }

also kannst auch den aufgerufenen uri innerhalb deiner callback function auslesen.

Arduino/ESP8266WebServer.h at master · esp8266/Arduino · GitHub

Ich habe rund 30 handlerfunktionen die immer nur einen Wert zurücksenden.

Es würde also reichen einer handler Funktion einen Parameter mitzugeben somit wäre mein Quelltext wäre erheblich kürzer und übersichtlicher.

Kann man einen Parameter mitgeben oder lässt "server.on" das gar nicht zu?

nein. Es gibt nur folgende Signaturen für on():

  void on(const Uri &uri, THandlerFunction handler);
  void on(const Uri &uri, HTTPMethod method, THandlerFunction fn);
  void on(const Uri &uri, HTTPMethod method, THandlerFunction fn, THandlerFunction ufn);

und der THandlerFunction ist

typedef std::function<void(void)> THandlerFunction;

void void : kein return - kein Parameter

aber noch mal.
Was würdest du als Funktionsparameter Parameter übergeben wollen?
Dort wo du die on callbacks definierst hast du nur den URI. Und den URI kannst eben lokal dann in der Callback Funktion abfragen.

Konzeptionell würde ich das aber sowieso anders angehen.
Nämlich den Client nicht 30 verschiedene Resourcen ("seiten") anbieten, sondern den Client schon einen Request mit Parameter stellen lassen und dann Serverseitig mittels den ganzen "Argument" Parametern arbeiten:

 const String& pathArg(unsigned int i) const; // get request path argument by number
  const String& arg(const String& name) const;    // get request argument value by name
  const String& arg(int i) const;          // get request argument value by number
  const String& argName(int i) const;      // get request argument name by number
  int args() const;                        // get arguments count
  bool hasArg(const String& name) const;   // check if argument exists

Probier mal das:

server.on("/", [&]() {
        this->onHandler(server);
      });

und in der Klasse dann

void onHandler(WebServer& server) {
      server.send(200, "text/html", WebContentLevel::getGreetings());
    }

Den Parameter server kannst natuerlich ersetzen :slight_smile:

Ok, danke für Eure Infos... ich werde das morgen mal testen...

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.