Danke!
HTTPs REST-API mit dem ESP8266 abfragen
-
In einem anderem Tutorial habe ich bereits erklärt, wie man einfache HTTP GET-Requests mit einem ESP8266 ausführen und verarbeiten kann. Mit dieser Möglichkeit werden leider keine Anfragen an mit SSL verschlüsselte Verbindungen unterstützt. Aus diesem Grund möchte ich es zum Anlass nehmen, hier ein kurzes Tutorial darüber zu machen, die man eine REST API mit dem ESP8266 abfragen kann, auch wenn die Verbindung mit SSL verschlüsselt ist.
Wichtig zu sagen ist: Die folgende Art und Weise ist nicht sicher, da wir ohne Fingerprint arbeiten und somit nur eine pseudo verschlüsselte Verbindung haben. Aber so können wir die Daten auslesen und verarbeiten.
Da wir mit einer REST API arbeiten, wäre es von Vorteil, wenn ihr euch mein Tutorial zum Thema Arduino IDE - Arbeiten mit JSON Objekten für Einsteiger anschauen würdet. Denn Ziel bei diesem Tutorial ist es, die Antwort des Servers ebenfalls als JSON behandeln zu können. Falls ihr nur schnell zum Ziel kommen wollt, reicht es die ArduinoJSON Library zu installieren.
Der Endpoint
Als Endpoint der Anfrage verwenden wir eine Beispiel API von MisterT diese könnt ihr unter https://rip-my.dev/get/mistert abfragen:
{ "name": "MisterT", "description": "Wir stehen für eine gesunde Lebensweise. T ", "ressources": [ "/settings", "/stats" ] }
In dem Array
ressources
stehen zusätzliche Endpunkte, die ihr callen könnt. Wir haben also insgesamt 3 REST-API Endpoints mit denen wir arbeiten können:- https://rip-my.dev/get/mistert
- https://rip-my.dev/get/mistert/settings
- https://rip-my.dev/get/mistert/stats
Ich entscheide mich für dieses Tutorial für den zweiten Endpoint, da wir dort am meisten Daten zum Testen haben.
Der Code
Als Grundlage verwende ich den Code aus meinem Tutorial ESP8266 HTTP-GET Request. Der einzige Unterschied ist, dass wir mit dem folgenden zwei Code-Anpassungen auch auf HTTPs Endpoints zugreifen können:
WiFiClient wifiClient;
wird zu:WiFiClientSecure wifiClient;
Zusätzlich, da wir ohne Fingerprint arbeiten, setzen wir den Client dann vor der eigentlichen REST-Abfrage auf insecure:
wifiClient.setInsecure();
Und schon kann eine GET-Request an einen HTTPs-Server gesendet werden.
/* HTTPS REST-API GET Basic-Code für GET-Request an einen HTTPS-Server Created by cooper, 2020 makesmart.net */ #include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> HTTPClient sender; WiFiClientSecure wifiClient; // WLAN-Daten const char* ssid = "WLAN-SSID"; const char* password = "WLAN-PSK"; void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(200); Serial.print("."); } Serial.println("Mit dem WLAN verbunden!"); Serial.println(); wifiClient.setInsecure(); if (sender.begin(wifiClient, "https://rip-my.dev/get/mistert/settings")) { // HTTP-Code der Response speichern int httpCode = sender.GET(); if (httpCode > 0) { // Anfrage wurde gesendet und Server hat geantwortet // Info: Der HTTP-Code für 'OK' ist 200 if (httpCode == 200) { // Hier wurden die Daten vom Server empfangen // String vom Webseiteninhalt speichern String payload = sender.getString(); // Hier kann mit dem Wert weitergearbeitet werden // ist aber nicht unbedingt notwendig Serial.println(payload); }else{ // Falls HTTP-Error Serial.print("HTTP-Error: " + String(httpCode)); } } // Wenn alles abgeschlossen ist, wird die Verbindung wieder beendet sender.end(); }else { Serial.printf("HTTP-Verbindung konnte nicht hergestellt werden!"); } } void loop() { }
Das ist mal eine Standard-HTTPs Anfrage an den definierten Server https://rip-my.dev/get/mistert/settings. Als Rückgabewert erhalten wir im seriellen Monitor das JSON Objekt als einfachen String:
{"adress":"192.168.178.27","name":"MisterT","default_fill_ml":220,"water_value":4.2,"additive_value":10.6,"standby_color":"#fff","strength":1,"api_enabled":true}
Diese Response möchten wir jetzt als JSON verarbeiten um sehr leicht auf die einzelnen Keys und Values zugreifen zu können. Das geht wie bereits erwähnt am einfachsten mit der ArduinoJSON Library.
Arbeiten mit der Response als JSON
Zuerst müssen wir in unserem Programm die Arduino JSON Library einbinden:
#include <ArduinoJson.h>
Die ganze restliche Magie passiert dann, nachdem wir die Antwort vom Server erhalten haben.
Das JSON-Objekt wird im Code bereits als Variablepayload
gespeichert, dass passiert in der folgenden Zeile:if (httpCode == 200) { // Hier wurden die Daten vom Server empfangen // String vom Webseiteninhalt speichern String payload = sender.getString(); // Hier kann mit dem Wert weitergearbeitet werden // ist aber nicht unbedingt notwendig Serial.println(payload); }
{ "adress": "192.168.178.27", "name": "MisterT", "default_fill_ml": 220, "water_value": 4.2, "additive_value": 10.6, "standby_color": "#fff", "strength": 1, "api_enabled": true }
Die Variable
payload
kann direkt dafür verwendet werden das JSON Objekt zu deserialisieren.if (httpCode == 200) { // Hier wurden die Daten vom Server empfangen // String vom Webseiteninhalt speichern String payload = sender.getString(); // Hier wird ein neuer Buffer mit dem Namen response erzeugt, mit dem wir an die Werte kommen DynamicJsonDocument response(1024); DeserializationError error = deserializeJson(response, payload); if (error) return; // Hier lesen wir die Werte über den Buffer aus String myName = response["name"]; int default_fill_ml = response["default_fill_ml"]; bool api_enabled = response["api_enabled"]; String standby_color = response["standby_color"]; // Einfache Ausgabe über den seriellen Monitor Serial.println(myName); Serial.println(default_fill_ml); Serial.println(api_enabled); Serial.println(standby_color); }
MisterT 220 1 #fff
So einfach ist, es eine REST API mit dem ESP8266 abzufragen. Wenn du dich mehr für das Thema ArduinoJSON interessierst, dann lohnt sich wie gesagt ein Blick in mein Tutorial Arduino IDE - Arbeiten mit JSON Objekten für Einsteiger. Und für alle die auf der Suche nach einer Copy & Paste Lösung sind, hier nochmal der komplette Code für das deserialisiereneiner REST-API Antwort:
/* HTTPS REST-API GET Basic-Code für GET-Request an einen HTTPS-Server Created by cooper, 2020 makesmart.net */ #include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> HTTPClient sender; WiFiClientSecure wifiClient; #include <ArduinoJson.h> // WLAN-Daten const char* ssid = "WLAN-SSID"; const char* password = "WLAN-PSK"; void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(200); Serial.print("."); } Serial.println("Mit dem WLAN verbunden!"); Serial.println(); wifiClient.setInsecure(); if (sender.begin(wifiClient, "https://rip-my.dev/get/mistert/settings")) { // HTTP-Code der Response speichern int httpCode = sender.GET(); if (httpCode > 0) { // Anfrage wurde gesendet und Server hat geantwortet // Info: Der HTTP-Code für 'OK' ist 200 if (httpCode == 200) { // Hier wurden die Daten vom Server empfangen // String vom Webseiteninhalt speichern String payload = sender.getString(); // Hier wird ein neuer Buffer mit dem Namen response erzeugt, mit dem wir an die Werte kommen DynamicJsonDocument response(1024); DeserializationError error = deserializeJson(response, payload); if (error) return; // Hier lesen wir die Werte über den Buffer aus String myName = response["name"]; int default_fill_ml = response["default_fill_ml"]; bool api_enabled = response["api_enabled"]; String standby_color = response["standby_color"]; // Einfache Ausgabe über den seriellen Monitor Serial.println(myName); Serial.println(default_fill_ml); Serial.println(api_enabled); Serial.println(standby_color); }else{ // Falls HTTP-Error Serial.print("HTTP-Error: " + String(httpCode)); } } // Wenn alles abgeschlossen ist, wird die Verbindung wieder beendet sender.end(); }else { Serial.printf("HTTP-Verbindung konnte nicht hergestellt werden!"); } } void loop() { }
-
Die Seite “https://rip-my.dev/get/mistert” ist nicht erreichbar.
Was kann ich tun? -
@rf Oh
Du kannst ne andere API zum testen verwenden:
https://gorest.co.in/public/v2/users/476
{ "id": 476, "name": "Brijesh Ahluwalia", "email": "ahluwalia_brijesh@goyette.net", "gender": "male", "status": "active" }
Oder viele weitere Endpunkte: https://gorest.co.in/