Empfangene HTML-Nachricht in Variable speichern

Hallo Gemeinde, ich betreibe ein Projekt mit zwei ESP8266. Der Client sendet einen HTML-Befehl an den Server. Der Server führt die Anweisung aus und meldet über client.print() den Erfolg. Diese Erfolgsmeldung kommt beim Client auch an und wird über serial.print() über HTML ausgegeben.
Diese HTML-Ausgabe möchte ich in einer Variable speichern und einen bestimmten Teil daraus extrahieren um damit weiter zu arbeite. Wie kann ich die HTML-Antwort vom Server in einer String-Variable speichern? Ist bestimmt ganz einfach, aber ich stehe bei HTML etwas auf dem Schlauch.
Gruß HM_DD

Wie wäre es, wenn du den Code einmal zeigen würdest?

Bitte posten Sie in englischer Sprache im englischen Bereich des Forums. Ihr Thema wurde in den deutschen Bereich verschoben.

Ursprünglicher Standort: WebEditor

Ja gern. Hier der Part vom Client:

```cpp
void WiFiSenden(char* Send1){
  // Beginn WiFi
    WiFiClient client;
    HTTPClient http;

      Serial.print("[HTTP] begin...\n");
    //if (http.begin(client, "http://192.168.178.61/gpio/1")) {  // HTTP
    if (http.begin(client, Send1)) {  // HTTP

      Serial.print("[HTTP] GET...\n");
      // start connection and send HTTP header
      int httpCode = http.GET();

      // httpCode will be negative on error
      if (httpCode > 0) {
        // HTTP header has been send and Server response header has been handled
        Serial.printf("[HTTP] GET... code: %d\n", httpCode);

        // file found at server
        if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
          String payload = http.getString();
          Serial.println(payload);
        }
      } else {
        Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
      }

      http.end();
Und hier der Antwortteil vom Server:


```cpp
  client.print(F("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nGPIO is now "));
  client.print((val) ? F("high") : F("low"));

Die Ausgabe auf den Server sieht dann so aus (2 Anweisungen übertragen):

Button 1-AUF

[HTTP] begin...

[HTTP] GET...

[HTTP] GET... code: 200

GPIO is now low

Button 1-Zu

[HTTP] begin...

[HTTP] GET...

[HTTP] GET... code: 200

GPIO is now high

Wenn Du nur 1 Wert aus der Antwort brauchst, warum antwortest Du dann als HTML und schickst nicht den einen Wert als text/plain.
Schau Dir auch mal das beim ESP8266 mit gelieferte Beispiel des Webservers an. Das geht einfacher, als die alte client.print-Methode.

Gruß Tommy

Mein Server ist genau das leicht angepasste Beispiel aus den ESP8266 Beispielen (WiFiManualWebServer.ino). Hat auf anhieb funktioniert und benutzt die client.print() Methode.

Wie müsste die Server-Antwort aussehen, wenn ich mittels taxt/plain die Variable val übermitteln will?
Gruß DD_HM

Dann schau mal anstelle von ESP8266WiFi in ESP8266WebServer.
Aber text/plain geht auch mit dem anderen.

Gruß Tommy

Wenn Du uns noch den geheimen Typ von val verrätst, könnte man das sagen.

Gruß Tommy

Hier der Teil wo val erstellt wird:

 Serial.println(req);

  // Match the request
  int val;
  //int val = 2;  // Ausgangszustand
  if (req.indexOf(F("/gpio/0")) != -1) {        // Auf
    val = 0;
  } else if (req.indexOf(F("/gpio/1")) != -1) { // Zu
    val = 1;
  } else {
    Serial.println(F("invalid request"));
    //val = digitalRead(LED_BUILTIN);
    val = 2;
  }

  // Set LED according to the request
  //digitalWrite(LED_BUILTIN, val);

  // Set GPIO's according to the request
  if (val == 0) {
    digitalWrite(0, 1); // GPIO0 ON
    delay(1000);        // wait 1 Sek.
    digitalWrite(0, 0); // GPIO0 OFF
    //val = 2;  // Reset val
  }
  else if (val == 1) {
    digitalWrite(2, 1); // GPIO2 ON
    delay(1000);        // Wait 1 Sek.
    digitalWrite(2, 0); // GPIO2 OFF
    //val = 2;  // Reset val
  }

Gruß DD_HM

Also ein int. Das könnte bei der umständlichen Variante so gehen:

client.print(F("HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\n"));
client.print(val);

Gruß Tommy

Super Tommy, das funktioniert prima. Jetzt wird nur noch 0 oder 1 als Antwort angezeigt, genau was ich wollte. Aber wie bekomme ich die Antwort auf der Client-Seite jetzt in eine Variable?
Bisher wird ja mittels :
Serial.printf("[HTTP] GET... code: %d\n", httpCode);
die Ausgabe erledigt. Zusätzlich soll die Antwort auch zur weiteren Verwendung in einer Variable "antw" gespeichert werden.

Du hast doch die Zeile

String payload = http.getString();

Da mache doch draus:

int antw = http.getString().toInt();

Gruß Tommy

AHH, klar hatte ich auch gerade gesehen, hier wird die Antwort ja bereits in die Variable "payload" gespeichert.

 // file found at server
        if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
          String payload = http.getString();
          Serial.println(payload);

Klasse Tommy, du bist der Größte. Ich programmiere schon viele Jahre mit Arduino. Aber die ESP Geschichte mit WIFI ist Neuland. Die ganze HTML Sache ist noch sehr verwirrend für mich. Aber jetzt komme ich richtig weiter, dank deiner Hilfe.
Gruß HM_DD

Dann schau dir wie bereits empfohlen das Beispiel

ESP8266WebServer

an und baue deinen Webserver entsprechend auf.

Ja, werde ich mir auf jeden Fall genauer ansehen. Man lernt ja nie aus und kann nur besser werden, Danke.

Gruß HM_DD

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