I want to get some JSON data from a HTTPS secured Webserver using a ESP8266. For some reason I'm getting an empty response, I believe there's an error parsing the GET request. In Chrome I get the JSON response without problems.
GET Request:
httpsClient.print(String("GET ") + path + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
Host and Path:
const char *host = "www.adler-mannheim.de";
const char *path = "/jsonapi/game/current";
UPDATE:
I tried fetching some JSON from another Server and it worked finde, so i can rule out my code. Fiddling around with the host and path I observe this:
Hostname without "www" results in a 301
Hostname with "https://www" results in no HTTPS connection at all
So it seems that a "www" is required although it unfortunately leads into a empty response.
The output is as follows:
headers received
reply was:
==========
==========
closing connection
In the first case, without using "www" in ahead of host there's some 301 HTML in between the two lines of "=".
Whole function:
void connect() {
WiFiClientSecure httpsClient; //Declare object of class WiFiClient
Serial.println(host);
httpsClient.setInsecure();
Serial.print("HTTPS Connecting");
int r=0; //retry counter
while((!httpsClient.connect(host, httpsPort)) && (r < 30)){
delay(100);
Serial.print(".");
r++;
}
if(r==30) {
Serial.println("Connection failed");
}
else {
Serial.println("Connected to web");
}
String getData, Link;
//GET Data
Serial.print("requesting URL: ");
Serial.println(host+Link);
httpsClient.print(String("GET ") + path + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
Serial.println("request sent: ");
Serial.println(String("GET ") + path + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
while (httpsClient.connected()) {
String line = httpsClient.readStringUntil('\n');
if (line == "\r") {
Serial.println("headers received");
break;
}
}
Serial.println("reply was:");
Serial.println("==========");
String line;
while(httpsClient.available()){
line = httpsClient.readStringUntil('\n'); //Read Line by Line
Serial.println(line); //Print response
}
Serial.println("==========");
Serial.println("closing connection");
delay(2000); //GET Data at every 2 seconds
}
UPDATE 2:
I tried the following code from the ESP8266HTTPClient Library examples:
void connect2() {
WiFiClientSecure client;
//client.setFingerprint(fingerprint);
client.setInsecure();
HTTPClient https;
Serial.print("[HTTPS] begin...\n");
if (https.begin(client, "https://github.com/esp8266/Arduino/issues/3417")) { // HTTPS
Serial.print("[HTTPS] GET...\n");
// start connection and send HTTP header
int httpCode = https.GET();
// httpCode will be negative on error
if (httpCode > 0) {
// HTTP header has been send and Server response header has been handled
Serial.printf("[HTTPS] GET... code: %d\n", httpCode);
// file found at server
if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
String payload = https.getString();
Serial.println(payload);
}
} else {
Serial.printf("[HTTPS] GET... failed, error: %s\n", https.errorToString(httpCode).c_str());
}
https.end();
} else {
Serial.printf("[HTTPS] Unable to connect\n");
}
Serial.println("Wait 10s before next round...");
delay(10000);
}
This one gives me a 200 but no payload. Other sites work
UPDATE 3:
I had a look on the headers.
https.headers()
This gives me 0 headers on every page, even when there's a payload.
I also had a closer look at the payload that returns from my desired api and its filled with NULL. In a weird way this is only the case with my desired page and only my desired subpages. Requesting something more at top level e.g "https://www.adler-mannheim.de/jsonapi" which is basically a SilverStripe Welcome page, I get a fully fetched beautiful HTML payload.
I got literally no Idea why. Do I have to set a specific User Agent or something so that the Server responds?