Send JSON Data with ESP32 over HTTP by WLAN -> no Answer

Ich benutze ein Wemos Lolin ESP32 Board welches ich mit Arduino programmiere.
Mein Ziel ist es, Json Daten mit HTTP via WLAN zu senden. Die Json Daten konnte ich auch korrekt zusammenstellen und ausgeben lassen.
Leider funktioniert es mit dem HTTP noch nicht so ganz. Ich erhalte keine Antwort, respektive nur eine leere Zeile. Erwartet wäre ein 200 OK ab der 9.Stelle. Daher gehe ich auch davon aus, dass die HTTP Verbindung noch nicht ganz korrekt ist. Die WLAN Verbindung hat funktioniert. Ich konnte das Gerät im WLAN sehen.

Ich hoffe Ihr könnt mir weiterhelfen. Vielen Dank!
Btw: Die Forumssuche habe ich natürlich schon fleissig genutzt. Habe jedoch keine Lösung zu meinem Problem gefunden.

#include <WiFi.h>
#include <ArduinoJson.h>
#include <ArduinoHttpClient.h>
//#include <HTTPClient.h>

const char* ssid     = "XXXX";
const char* password = "XXXX";

//Create WiFi Object
WiFiClient client;
const char _ip_Adress[] = "XX.XXX.XXX.XXX";
String url = "POST";
int Length; 


void setup() 
{
  // put your setup code here, to run once:
  Serial.begin(9600);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) 
  {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
} //End Setup

void loop() {
  // put your main code here, to run repeatedly:
  
    StaticJsonBuffer<300> JSONbuffer;   //Declaring static JSON buffer
    JsonObject& JSONencoder = JSONbuffer.createObject(); 
 
    JSONencoder["DeviceId"] = "113";
    JSONencoder["Name"] = "JsonTest";
    JSONencoder["Serial"] = "5005191";
    JSONencoder["Token"] = "0";

 
    JsonArray& Index = JSONencoder.createNestedArray("Index"); //JSON array
    Index.add(1); //Add value to array

    JsonArray& Typ = JSONencoder.createNestedArray("Typ"); //JSON array
    Typ.add(1); //Add value to array
   
    JsonArray& Unit = JSONencoder.createNestedArray("Unit"); //JSON array
    Unit.add("%rh"); //Add value to array

    JsonArray& Value = JSONencoder.createNestedArray("Value"); //JSON array
    Value.add(32.4); //Add value to array

    char JSONmessageBuffer [512];
    JSONencoder.prettyPrintTo(JSONmessageBuffer, sizeof(JSONmessageBuffer));
    Serial.println(JSONmessageBuffer);

    //Create url
    url = "POST";
    url += " ";
    url += "/XXX/XXX.XXX.svc/";
    url += "UpdateDataJson";
    url += " HTTP/1.1";
    Serial.println(url);
    //Length output from Body -> used as Content Length
    Length = sizeof(JSONmessageBuffer);
    
    if (client.connect(_ip_Adress, 80))
      {
        //Send HTTP Header to Server
        client.println(url);
        client.println("Content-Type: application/json");
        client.println("HOST: " + String(_ip_Adress));
        client.print("Content-Length: ");
        client.println(Length);
        client.println("Connection: Close");
        client.println();
    
        //Send Json Data
        client.println(JSONmessageBuffer);

        //Check Answer
        String answer = client.readStringUntil('\r');

        Serial.println("Vor der Antwort");
        Serial.println(answer);
        Serial.println("Nach der Antwort");

        if (answer.startsWith("200 OK", 9))
        {
          Serial.println("HTTP: OK");
        }
      }

    delay(1000);  //Send a request every 1 second
    
}

Hänge doch mal in if (client.connect(_ip_Adress, 80)) eine serielle Ausgabe rein, ob er überhaupt connected.

Ist der Server lokal? Wenn ja, hast Du da eine Namensauflösung, da Du die IP als Zeichenkette übergibst?
Wenn nein, könnte Dein Hostname falsch sein.

Gruß Tommy

Danke für die Antwort.
Die If-Schlaufe habe ich bereits kontrolliert. In diese springt er rein.
Ich bin nicht sicher ob ich wirklich direkt die URL gerade zu Beginn bereits mit UpdateDataJson senden kann oder ob ich zuerst einmal mit dem ServerNamen statt Update... senden muss und danach erneut senden mit Update...
Ich weiss dass es bei HTTP etwas gibt bezüglich Cariiage Return, Newline, Linefeed etc.
Aber so wie ich das sehe ist das korrekt, da ich nach dem Connection Close noch ein leeres println sende. Oder nicht?

Ein paar Ideen, woran es hängen könnte:

  • Sendet println() das richtige Zeilenende? Muss CRLF sein.
  • Sendest du wirklich soviele Bytes wie in Content-Length angegeben? Ist sizeof() hier das richtige?
  • answer.startsWith("200 OK", 9) -> Das OK ist eher ein Vorschlag was man da hinschreiben könnte, wenn einem garnichts anderes mehr einfällt. Ist also Serverimplementations abhängig. Auch würde ich nicht davon ausgehen, das die HTTP-Version 9 Zeichen lang ist.
  • Warum HTTP 1.1 anfordern wenn man eher HTTP 1.0 "parst"?
  • Den Header Host an 1. Stelle
  • (Keine Auswertung ob da ein Redirect zurück kommt)