Connexion HTTP à API countrylayer - demande aide

Bonjour à tous,
Je cherche à adapter un programme d'accès à l'API openweathermap

pour accéder à l'API countrylayer :

Je n'arrive pas à reproduire la construction du String serverPath (copie ci dessous) pour l'adresse de la requête. Je me perd après le ? .

String serverPath = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "," + countryCode + "&APPID=" + openWeatherMapApiKey;

Pour l'instant, j'arrive à me connecter et recevoir les données Json avec :

String serverPath = "http://api.countrylayer.com/v2/all?access_key=d8xxxxxxxxxxxxx16";
ou : String serverPath = "http://api.countrylayer.com/v2/capital/Kabul?access_key=d8xxxxxxxxxxxxx16";

pour avoir des données concernant la capitale Kabul
mais j'aimerais bien comprendre comment écrire la string serverPath avec des ? et + "access_key="API_KEY

Si quelqu'un pouvait m'aider à construire cette String pour ces deux cas, ça m'aiderait à comprendre la syntaxe ?

Ci dessous mon programme avec les Strings ServerPath qui fonctionnent et celle avec l'API_KEY commentée qui ne fonctionne pas.

/*
 Rui Santos
 Complete project details at Complete project details at https://RandomNerdTutorials.com/esp32-http-get-open-weather-map-thingspeak-arduino/

 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files.

 The above copyright notice and this permission notice shall be included in all
 copies or substantial portions of the Software.
*/

#include <WiFi.h>
#include <HTTPClient.h>
#include <Arduino_JSON.h>

const char* ssid = "Livebox-xxxx";
const char* password = "xxxxxx";

// Your Domain name with URL path or IP address with path
String API_KEY = "d86xxxxxxxxxxx516";

// Replace with your capital
String capital = "Kabul";

// THE DEFAULT TIMER IS SET TO 10 SECONDS FOR TESTING PURPOSES
// For a final application, check the API call limits per hour/minute to avoid getting blocked/banned
unsigned long lastTime = 0;
// Timer set to 10 minutes (600000)
//unsigned long timerDelay = 600000;
// Set timer to 20 seconds (20000)
unsigned long timerDelay = 20000;

String jsonBuffer;

void setup() {
 Serial.begin(115200);
 delay(1000);

 Serial.println(); Serial.print ("Sketch : "); Serial.print ("countrylayer.ino"); Serial.println();

 WiFi.begin(ssid, password);
 Serial.println("Connecting");
 while (WiFi.status() != WL_CONNECTED) {
   delay(500);
   Serial.print(".");
 }
 Serial.println("");
 Serial.print("Connected to WiFi network with IP Address: ");
 Serial.println(WiFi.localIP());

 Serial.println("Timer set to 10 seconds (timerDelay variable), it will take 10 seconds before publishing the first reading.");
}

void loop() {
 // Send an HTTP GET request
 if ((millis() - lastTime) > timerDelay) {

   // Check WiFi connection status
   if (WiFi.status() == WL_CONNECTED) {
     //String serverPath = "http://api.countrylayer.com/v2/capital/Kabul?access_key=d86407a515e2b3d7915fb4426de9e516";
     //String serverPath = "http://api.countrylayer.com/v2/all? + "access_key=" + API_KEY";
     String serverPath = "http://api.countrylayer.com/v2/all?access_key=d86407a515e2b3d7915fb4426de9e516";
     Serial.println(serverPath);
     
     jsonBuffer = httpGETRequest(serverPath.c_str());
     Serial.println(jsonBuffer);
     JSONVar myObject = JSON.parse(jsonBuffer);

     // JSON.typeof(jsonVar) can be used to get the type of the var
     if (JSON.typeof(myObject) == "undefined") {
       Serial.println("Parsing input failed!");
       return;
     }

     /* Serial.print("JSON object = ");
       Serial.println(myObject);
       Serial.print("Temperature: ");
       Serial.println(myObject["main"]["temp"]);
       Serial.print("Pressure: ");
       Serial.println(myObject["main"]["pressure"]);
       Serial.print("Humidity: ");
       Serial.println(myObject["main"]["humidity"]);
       Serial.print("Wind Speed: ");
       Serial.println(myObject["wind"]["speed"]);*/
   }
   else {
     Serial.println("WiFi Disconnected");
   }
   lastTime = millis();
 }
}

String httpGETRequest(const char* serverName) {
 HTTPClient http;

 // Your IP address with path or Domain name with URL path
 http.begin(serverName);

 // Send HTTP POST request
 int httpResponseCode = http.GET();

J'utilise un ESP32 wroom

Merci de votre aide

La documentation indique bien la même URL que ce que tu as écris

"http://api.countrylayer.com/v2/capital/Kabul?access_key=d8xxxxxxxxxxxxx16"

Que te renvois le site avec une clé valide ?

Tu as laissé ta clé dans le code, du coup en testant, il semble que ta clé n'est pas valide.

Bonsoir Terwal, bonsoir à tous,
Avec cette String serverPath,

String serverPath = "http://api.countrylayer.com/v2/capital/Kabul?access_key=d86407a515e2b3d7915fb4426de9e516";

j'obtiens :

Connected to WiFi network with IP Address: 192.168.1.45
Timer set to 10 seconds (timerDelay variable), it will take 10 seconds before publishing the first reading.
http://api.countrylayer.com/v2/capital/Kabul?access_key=d86407a515e2b3d7915fb4426de9e516
HTTP Response code: 200
[{"name":"Afghanistan","topLevelDomain":[".af"],"alpha2Code":"AF","alpha3Code":"AFG","callingCodes":["93"],"capital":"Kabul","altSpellings":["AF","Af\u0121\u0101nist\u0101n"],"region":"Asia"}]

donc, la requête fonctionne.
Ce que je souhaite, c'est entrer des valeurs avec une ou plusieurs variables comme par exemple :"String capital = "Kabul";
je souhaiterais également entrer mon API_KEY sous forme de variable `String API_KEY = "d86407a515e2b3d7915fb4426de9e516";
En définitive, savoir écrire une la String serverPath après le point d'interrogation ? de la même manière que celle écrite pour avoir accès aux données Openweathermap :

String serverPath = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "," + countryCode + "&APPID=" + openWeatherMapApiKey;

Je ne sais pas si je suis assez clair dans ma demande et si j'emploie les bons mots mais merci pour l'aide!

C'est ce que fait cette ligne dans le code dont tu parles

      String serverPath = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "," + countryCode + "&APPID=" + openWeatherMapApiKey;

En utilisant la classe String il suffit d'utiliser + pour concaténer des chaines de caractères.
Dans le code ci-dessus, city, countryCode et openWeatherMapApiKey sont des variables que l'ont insère dans la requète.

Bonsoir fdufnews,

Merci pour la réponse mais, dans mon cas, c'est ce que j'essaye de reproduire avec cette requête qui ne fonctionne pas :

String serverPath = "http://api.countrylayer.com/v2/all? + "access_key=" + API_KEY";

Donc, ma syntaxe est fausse!
Idem si je veux avoir seulement les données sur Kabul,

String serverPath = http://api.countrylayer.com/v2/capital/Kabul?access_key=d86407a515e2b3d7915fb4426de9e516";

C'est vraiment la syntaxe de l'écriture d'une requête HTTP avec des variables (Capital, accesKey= API_KEY, etc...
Merci

Les guillemets sont mal placées. C'est une concaténation de chaines de caractères et de variables, il faut donc mettre des chaines entre guillemets et des variables (de type chaines de caractères ou de type String) avec un + entre les éléments.

String serverPath = "http://api.countrylayer.com/v2/all?access_key=" + API_KEY;

L'URL est bonne si tu fais un copié/collé de cette URL la requête aboutit

Lorsque tu as des problèmes comme ça, le plus simple pour trouver le problème c'est de faire imprimer dans le moniteur série l'URL et éventuellement de faire un copié-collé de celle-ci dans un navigateur internet pour voir où est le problème.

Non, si tu regarde la documentation, après le ?, il ne peut y avoir que la variable de requête access_key.
Il n'existe pas de variable de requête "capital", car le nom de la capitale est donné dans l'URL de l'API REST
Donc la seul URL possible est:
http://api.countrylayer.com/v2/capital/{nom de la capital}?access_key={valeur de ta clé}

Bonsoir fdufnews, Terwal, Bonsoir à tous,

Finalement j'y suis arrivé avec cette méthode :

     String serverPath = "http://api.countrylayer.com/v2/capital/kabul?";
     serverPath += "access_key=";
    serverPath += API_KEY;

Donc, j'arrive à avoir les données sous la forme :

[{"name":"Afghanistan","topLevelDomain":[".af"],"alpha2Code":"AF","alpha3Code":"AFG","callingCodes":["93"],"capital":"Kabul","altSpellings":["AF","Af\u0121\u0101nist\u0101n"],"region":"Asia"}]

mais je n'arrive pas à extraire les données désirées telles : "name" pour le pays ou "capital" pour la capitale
Je pense que c'est parce que myObject est un tableau.
et... je ne sais pas comment faire!

voici ce que j'obtiens

onnected to WiFi network with IP Address: 192.168.1.45
http://api.countrylayer.com/v2/capital/kabul?access_key=4dd6aaef6ea0bb39acc9e062c411a536
HTTP Response code: 200
JsonBuffer = [{"name":"Afghanistan","topLevelDomain":[".af"],"alpha2Code":"AF","alpha3Code":"AFG","callingCodes":["93"],"capital":"Kabul","altSpellings":["AF","Af\u0121\u0101nist\u0101n"],"region":"Asia"}]
JSON object = [{"name":"Afghanistan","topLevelDomain":[".af"],"alpha2Code":"AF","alpha3Code":"AFG","callingCodes":["93"],"capital":"Kabul","altSpellings":["AF","Afġānistān"],"region":"Asia"}]
Pays: null
Capitale: null
Region: null
Alpha3Code: null

Pouvez-vous encore m'orienter vers une solution?

Tu vas sur ArduinoJson Assistant 7 | ArduinoJson 7

  • Tu réponds aux questions
  • Tu copies ton json dedans la fenêtre JSON au step 2
  • au pas suivant tu as un exemple de code pour récupérer tes infos

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