string Probleme

Hallo Zusammen,
ich bin grade dabei meine Worduhr um eine Statuszeile zu erweitern und möchte dazu gerne die Wetterdaten von OpenWeatherMap nutzen.

Mit der API als solches gibt's soweit auch kein Problem.
Mein Problem liegt an der Deklaration/Zusammstellung der URL.

Geh ich wie folgt vor bekomme ich ein HTTP-Statuscode von 200 und die entsprechenden Wetterdaten.

  String httpTestLink;  
  httpTestLink = "http://api.openweathermap.org/data/2.5/forecast?id=3221033&mode=xml&lang=de&units=metric&appid=cddce1bd28dc16d16562f8"; // apiKey fürs Forum gekürzt

Da ich die CityID und den apiKey etwas variabel halten möchte habe ich es wie folgt versucht.
Jedoch bekomme ich so ein HTTP-Statuscode von 400, Bad Request

  String httpLink;
  String Serverlink = "http://api.openweathermap.org/data/2.5/forecast?id=";
  String CityID = "3221033";
  String ServerPara = "&mode=xml&lang=de&units=metric&appid=";
  String apiKey = "cddce1bd28dc16d16562";// apiKey fürs Forum gekürzt


  httpLink = Serverlink;        
  httpLink.concat(CityID);      
  httpLink.concat(ServerPara);  
  httpLink.concat(apiKey);   

//Alternativ: httpLink = Serverlink + CityID + ServerPara + apiKey;

Und irgendwie kann ich da keinen Fehler finden :confused:
Hat jemand von euch eine Idee woran es liegen könnte ?

Zur vollständigkeit mal die ganze Funktion:

void OpenWeatherMap_Get(){
String OWM_Result;
int httpCode;
String httpLink;
String httpTestLink;

  if (debug) Serial.println( "" );
  if (debug) Serial.println( "OpenWeatherMap_Get");
  if (debug) Serial.println( "**********************************************************" );

  // Funktioniert: --> httpCode = 200
  httpTestLink = "http://api.openweathermap.org/data/2.5/forecast?id=3221033&mode=xml&lang=de&units=metric&appid=cddce1bd28dc16d16";// apiKey fürs Forum gekürzt
  if (debug) Serial.print( "Funktioniert      : "); if (debug) Serial.print( httpTestLink ); if (debug) Serial.println( "<" );


  // Funktioniert NICHT: --> httpCode = 400
  httpLink = Serverlink;        
  httpLink.concat(CityID);      
  httpLink.concat(ServerPara);  
  httpLink.concat(apiKey);      
  if (debug) Serial.print( "Funktioniert NICHT: "); if (debug) Serial.print( httpLink ); if (debug) Serial.println( "<" );


  // Funktioniert NICHT: --> httpCode = 400
  //httpLink = Serverlink + CityID + ServerPara + apiKey;
  //if (debug) Serial.print( "Funktioniert NICHT: "); if (debug) Serial.print( httpLink ); if (debug) Serial.println( "<" );

  
  if ((WiFi.status() == WL_CONNECTED)) { 
    HTTPClient http;
    http.begin(httpLink); 
    httpCode = http.GET();                                        
    if (httpCode > 0) {
      OWM_Result = http.getString();
      if (debug) Serial.println( "HTML Result ==> ");
      if (debug) Serial.println(OWM_Result);
      http.end();
    } else {
      if (debug) Serial.println( "httpCode <= 0");
      http.end();
      return;
    }
  } else {
    if (debug) Serial.println( "No WIFI Connection");
    return;
  }
  //Parsen des HTML Codes zur Fehleranalyse entfernt
}

Schon mal besten Dank im voraus.
Grüße Jürgen

Da man aus Deinem Sketch nicht erkennen kann, welchen Prozessor Du nutzt, schon mal der Hinweis, dass auf den normalen Arduinos (Atmega 2560, 328 und co.) Die Verwendung der Klasse String ungünstig ist.

Ansonsten lasse Dir doch einfach mal den resultierenden String nach Serial ausgeben und vergleiche ihn mit dem funktionierenden String.

Gruß Tommy

Hallo Tommy,
die Strings sehen erstmal gleich aus:

OpenWeatherMap_Get


Funktioniert : http://api.openweathermap.org/data/2.5/forecast?id=3221033&mode=xml&lang=de&units=metric&appid=cddce1< // ID gekürzt, sind aber gleich
Funktioniert NICHT: http://api.openweathermap.org/data/2.5/forecast?id=3221033&mode=xml&lang=de&units=metric&appid=cddce1< // ID gekürzt, sind aber gleich

HTML Result ==>

400 Bad Request

400 Bad Request


nginx

Das ganze läuft auf einem ESP32

    char httpLink[200];     // größe anpassen
    const char* Serverlink = "http://api.openweathermap.org/data/2.5/forecast?id=";
    const char* CityID = "3221033";
    const char* ServerPara = "&mode=xml&lang=de&units=metric&appid=";
    const char* apiKey = "cddce1bd28dc16d16562";// apiKey fürs Forum gekürzt
    snprintf (httpLink, sizeof(httpLink), "%s%s%s%s", Serverlink, CityID, ServerPara, apiKey);

Ungetestet da ich bei denen kein Kunde bin!

Gruß Fips

Danke Fips,

so funktioniert es.

Fips,
hast du vlt. eine Erklärung dafür warum das mit String geht und mit einem zusammengesetztem String nicht?

Gruß Jürgen

Fips hat keinen String verwendet, sondern char-Arrays. Infos hier.

Gruß Tommy

Das Fips keinen String benutz ist klar.

Bei meinem Code funktioniert die URL als direkt deklarierter String, als zusammen gesetzter String nicht, obwohl die lt. Serial genau gleich aussehen.

Irgendeinen Unterschied wird es also geben. Die Frage ist halt welcher?

Gruß Jürgen

Hi

Dann lasse Dir Deine beiden Strings doch Mal zeichenweise im Terminal ausgeben - vll. als HEX, ich vermute Da 'nicht druckbare Zeichen' drin.

MfG

Hi,
das mit der Ausgabe hab ich mal getestet, leider auch hier beide Ausgaben gleich.

Link: http://api.openweathermap.org/data/2.5/forecast?id=3221033&mode=xml&lang=de&units=metric&appid=cddce1bd28dc1
Länge 127
68 74 74 70 3A 2F 2F 61 70 69 2E 6F 70 65 6E 77 65 61 74 68 65 72 6D 61 70 2E 6F 72 67 2F 64 61 74 61 2F 32 2E 35 2F 66 6F 72 65 63 61 73 74 3F 69 64 3D 33 32 32 31 30 33 33 26 6D 6F 64 65 3D 78 6D 6C 26 6C 61 6E 67 3D 64 65 26 75 6E 69 74 73 3D 6D 65 74 72 69 63 26 61 70 70 69 64 3D 63 

zusammengesetzt
Link: http://api.openweathermap.org/data/2.5/forecast?id=3221033&mode=xml&lang=de&units=metric&appid=cddce1bd28dc16d1
Länge 127
68 74 74 70 3A 2F 2F 61 70 69 2E 6F 70 65 6E 77 65 61 74 68 65 72 6D 61 70 2E 6F 72 67 2F 64 61 74 61 2F 32 2E 35 2F 66 6F 72 65 63 61 73 74 3F 69 64 3D 33 32 32 31 30 33 33 26 6D 6F 64 65 3D 78 6D 6C 26 6C 61 6E 67 3D 64 65 26 75 6E 69 74 73 3D 6D 65 74 72 69 63 26 61 70 70 69 64 3D 63

Normalerweise bin ich ja ein Freund davon aus Fehlern zu lernen, hier scheint es mir, das ich mich einfach damit abfinden muss :confused: