ESP8266 - HTTP Post wird an "&" unterbrochen. Komme nicht weiter

Hallo Zusammen,
ich baue mit meinem ESP8266 eine Verbindung zu meinem WLAN Netzwerk auf und warte lediglich auf eingehende Requests.

Hier der Quellcode:

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
 
ESP8266WebServer server(80);
 
const char* ssid = "SSID";
const char* password =  "PW";
 
void setup() {
 
    Serial.begin(115200);
    WiFi.begin(ssid, password);  //Connect to the WiFi network
 
    while (WiFi.status() != WL_CONNECTED) {  //Wait for connection
 
        delay(500);
        Serial.println("Waiting to connect...");
 
    }
 
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());  //Print the local IP
 
    server.on("/body", handleBody); //Associate the handler function to the path
 
    server.begin(); //Start the server
    Serial.println("Server listening");
 
}
 
void loop() {
 
    server.handleClient(); //Handling of incoming requests
 
}
 
void handleBody() { //Handler for the body path
 
      if (server.hasArg("plain")== false){ //Check if body received
            server.send(200, "text/plain", "Body not received");
            return;
      }
 
      String message = "Body received:\n";
             message += server.arg("plain");
             message += "\n";
 
      server.send(200, "text/plain", message);
      Serial.println(message);
}

Nun möchte ich Informationen im JSON Format per HTTP Post übertragen. BSP:

{
  "password": "s&73xm?s",
  "username": "mustermann"
}

Das Problem ist, dass an jedem &-Zeichen unterbrochen wird. Die Ausgabe meines Serial Monitors sieht wie folgt aus:

Body received:
{
  "password": "s

Es ist gut zu sehen, dass nach dem “s” nichts weiteres empfangen wurde, weil das “&” eigentlich einen neuen Parameter ankündigt. Wie kann ich das umgehen? Ich möchte zum Teil sehr große JSON Dateien übertragen in denen so ziemlich alle Zeichen übertragen werden.

Im Anhang noch ein Screenshot von meinen Einstellungen für den HTTP Post
Bildschirmfoto 2017-09-30 um 19.13.58.png

Ich glaube ich habe mir gerade selber helfen können. Für alle die ein ähnliches Problem haben ist encodeURIComponent() das Stichwort. Muss mal schauen wie ich das dann auch auf Arduino Ebene gelöst bekomme...

Ersetzt man das &-Zeichen mit "%26" erfolgt die Übertragung problemlos.

Referenz Link

Wenn ich das richtig sehe willst du Json als Objekt übertragen.
Das sieht bei mir so aus.

String temp = "{\"ResetReason\":\"" + ESP.getResetReason() + "\", \"Hostname\":\"" + WiFi.hostname() + "\", \"FreeHeap\":\"" + ESP.getFreeHeap() + "\", \"CpuFreqMHz\":\"" + ESP.getCpuFreqMHz() + "\", \"SketchSize\":\"" + ESP.getSketchSize() + "\", \"ClientIP\":\"" + server.client().remoteIP().toString() +  "\", \"SdkVersion\":\"" + ESP.getSdkVersion() + "\"}";
  server.send(200, "application/json", temp);     // Json als Objekt

wenn ich als Beispiel "s&73xm?s" unter Hostnahme eintrage

 String temp = "{\"ResetReason\":\"" + ESP.getResetReason() + "\", \"Hostname\":\"s&73xm?s\", \"FreeHeap\":\"" + ESP.getFreeHeap() + "\", \"CpuFreqMHz\":\"" + ESP.getCpuFreqMHz() + "\", \"SketchSize\":\"" + ESP.getSketchSize() + "\", \"ClientIP\":\"" + server.client().remoteIP().toString() +  "\", \"SdkVersion\":\"" + ESP.getSdkVersion() +  "\", \"Channel\":\"" +  WiFi.channel() + "\"}";
  server.send(200, "application/json", temp);     // Json als Objekt

steht auf meiner Webseite dann "Hostname: s&73xm?s"

du kannst es auch als Json Array übertragen

das sieht bei mir so aus

  String temp = "[\"" + runtime() + "\",\"" + analogRead(A0) + "\",\"" + WiFi.RSSI() + "\"]";
  server.send(200, "application/json", temp);     // Json als Array

wenn ich anstatt "analogRead(A0)" deine Zeichenkette eintrage

String temp = "[\"" + runtime() + "\",\"s&73xm?s\",\"" + WiFi.RSSI() + "\"]";
  server.send(200, "application/json", temp);     // Json als Array

steht auf meiner Seite
LDR: = s&73xm?s

Gruß Fips