Wie: Datenübergabe via Post mit der Ethernet Lib ?

Hallo,
Ich habe einen kleinen Webserver Arduino Mega und Ethernet Shield.
Ich möchte nun von Get auf Post wechseln.

Der Teil des Html Code schaut so aus.

<tr bgColor='#222222'>
<td align='center' bgcolor='#222222'><form method="post"><input type=submit name=1 value='Einschalten'></form></td>
<td align='center' bgcolor='#222222'><form method="post"><input type=submit name=1 value='Ausschalten'> </form></td>
<td align='center'><font color='red' size='5'>AUS

Auf den Arduino lese ich mit der read Methode der Ethernet Lib ein, was der Browser zum Server (Arduino) schickt.
Beim Betätigen der Buttons kommt dies, leider fehlt nach den Post der value Wert.
Warum ??

POST /page4.htm HTTP/1.1
Host: 192.168.0.177
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gec
ko/20100101 Firefox/27.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.
9,*/*;q=0.8
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://192.168.0.177/page4.htm
Authorization: Basic xxxxxxxxxxxxxx=
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 13

Via Get funktioniert dies einwandfrei

GET /page4.htm?2=Einschalten HTTP/1.1
Host: 192.168.0.177
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gec
ko/20100101 Firefox/27.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.
9,*/*;q=0.8
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://192.168.0.177/page4.htm
Authorization: Basic  xxxxxxxxxxxxxxxxxxx=
Connection: keep-alive

rudirabbit:
Content-Length: 13

Dein Browser sagt, dass nach dem Header 13 Bytes Daten kommen.

Also ich glaube dem Browser, dass er diese 13 Bytes tatsächlich sendet.

Dein Browser sagt, dass nach dem Header 13 Bytes Daten kommen.
Also ich glaube dem Browser, dass er diese 13 Bytes tatsächlich sendet.

Das glaube ich auch, nur wie komme ich da dran ?

 while (client.connected()) {
      if (client.available()) {
        char c = client.read();
         HTTP_req += c;
...

Ich lese so in den HTTP_req String ein, und bekomme nur den Header (also das was ich gepostet habe).
Es liegt der Verdacht nahe das read() von der Ethernet Lib nur den Header zurückgibt ???

Ich meine auch gelesen zu habe das dies mit der read() Methode nicht funktioniert - stimmt das ?

PS: Ich weiß, hier wird ein String Objekt benutzt. Das ist ein Projekt das ich vor ca. 1 Jahr angefangen habe, und immer weiter wächst.
Inzwischen würde ich auch kein String Objekt mehr nutzen, bzw ich habe vor auf char arrays umzustellen.
Das ist aber hier nicht das Problem.

rudirabbit:
Ich lese so in den HTTP_req String ein, und bekomme nur den Header (also das was ich gepostet habe).
Es liegt der Verdacht nahe das read() von der Ethernet Lib nur den Header zurückgibt ???

client.read() liefert aus einer bestehenden Client-Verbindung alle Zeichen, die der Client sendet, ohne dass zwischendurch ein Timeout auftritt.

Header + Content.

Es steht allerdings zu vermuten, dass Du in Deiner while-Schleife, von der Du nur einen kleinen Ausschnitt zeigst, eine Abbruchbedingung gesetzt hast, mit der die Schleife nach dem Header verlassen und die Client-Verbindung danach geschlossen wird. Dann landet der gesendete Content im Orkus nachdem der Header empfangen wurde.

Ein Programm macht immer das, was Du programmiert hast.
Wenn Du keinen HTTP-Content empfängst, obwohl Du welchen gesendet bekommst, dann liegt das daran, dass Du das so programmiert hast.

client.read() liefert aus einer bestehenden Client-Verbindung alle Zeichen, die der Client sendet, ohne dass zwischendurch ein Timeout auftritt.

Das wollte ich bestätigt haben, danke !

Es handelt sich im Prinzip um den Beispielcode aus der Lib der wohl nur den Header liest und dann die Verbindung schließt.
Ich meinte den Datenaustausch zwischen Server und Browser verstanden zu haben, das ist offensichtlich nicht so. :blush:

 EthernetClient client = server.available();
  if (client) {
    authentificated=false;
    //Serial.println("new client");

    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
         HTTP_req += c;
       
if (c == '\n' && currentLineIsBlank) {
    
        Process_switcher(client);
        Site_Swichter(client);
         if (authentificated) {
            if (page==1)    sendhtmheader_css_neu(client);
             if (page==2)  sendhtlmheader_css_page2(1,client); 
              if (page==3)  sendhtlmheader_css_page2(2,client); 
                 if (page==4)  sendhtlmheader_css_page4(client); 
                              }

                                      else
                                               SendAuthentificationpage(client);
          break;
                                       }
 if (c == '\n') {
          // you're starting a new line
          if (HTTP_req.indexOf("Authorization: Basic")>0 && HTTP_req.indexOf("xxxxxxxxxxxxxxxx=") >0)
            authentificated=true;

          currentLineIsBlank = true;
                 }

        else if (c != '\r') {
          // you've gotten a character on the current line
           currentLineIsBlank = false;
                             }
      }
    }
     delay(1);

    // close the connection:
    client.stop();
    //Serial.println("client disonnected");
    HTTP_req="";


  }


}

rudirabbit:

Es handelt sich im Prinzip um den Beispielcode aus der Lib der wohl nur den Header liest und dann die Verbindung schließt.

Ja klar, so steht es da:

  if (c == '\n' && currentLineIsBlank) {

// mache irgendwas
   break; // ==> SCHLEIFE VERLASSEN!
 }
...
   // close the connection:
   client.stop();  ==> VERBINDUNG ABWÜRGEN




Der Header ist zuende, wenn im Header eine Leerzeile vorkommt, also ein Zeilenendezeichen nach einer leeren Zeile folgt. Dann beendest Du Deine Empfangsschleife.

Nach dem Empfang des Headers liest Du kein einziges Byte mehr.
Wenn Du die 13 Bytes empfangen möchtest, die im Header angekündigt sind, mußt Du diese 13 Bytes natürlich empfangen, BEVOR Du mit client.stop() die Verbindung beendest.

Der Header ist zuende, wenn im Header eine Leerzeile vorkommt, also ein Zeilenendezeichen nach einer leeren Zeile folgt. Dann beendest Du Deine Empfangsschleife.

In diesem Kontext verstehe ich dann den Code auch.
Wobei ich das auch vorher, also ohne dieses Wissen wann ein Header zu Ende ist, dies rein aus dem Code entnehmen hätte können. (müssen)
Ich denke nun schon was ich machen muss damit die Schleife x Content-Length Bytes nach Headerende weiterliest.

Ist immer wieder nett mit dir zu plaudern :slight_smile:

So, dank des Tips von jurs kann ich nun auch die Content-Length Bytes einlesen.

Der Rest ist dann nur noch parsen und darauf reagieren, hier ein Relais ein oder ausschalten.

Ein Problem habe ich aber noch, das geht wohl in die HTML Richtung.
Wenn ein Botton gedrückt wird, der Browser schickt dann die Post Bytes. Relais zieht an oder schaltet ab, alles wie gewollt.
Wenn ich aber den Browser die Seite neu laden lasse (Refresh Botton des Browsers) , schickt er die Post Bytes nochmal.

Solange sich nur ein Client eingeloggt hat, spielt das keine Rolle.
Wenn aber zwei Clients online sind, gibt es beim Refresh komische Effekte mit den Relais.

Kann man dies ausschalten ? Steckt wohl im Browser Cache drin.

<meta http-equiv="content-type" content="text/html; charset=utf-8">
<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="0">

Ich habe schon etwas rumgespielt, war leider nicht zielführend.