JSON Exception aus http Request abfangen
Verfasst: 08.06.2020 14:30
Verschiedene Rückmeldungen zur Usermap haben mich (nach Ausprobieren) zu der Erkenntnis geführt, dass ich noch einen Bug in der Abfrage der Geonames Datenbank habe, nämlich dann, wenn sie einen Fehlercode (heißt da Status) zurückgibt, z.B. wenn man versucht, einen ungültigen Benutzernamen anzugeben.
Die Abfrage ist wie folgt geschrieben:
Ich habe jetzt den Originalcode eingestellt, auch wenn mir inzwischen selbst aufgefallen ist, dass in Zeile 2 ein '@' fehlt, um die Fehlermeldungen zu unterdrücken (ist inzwischen ergänzt, aber mit wäre mir wahrscheinlich noch nicht aufgefallen, dass da was nicht klappt - und irgendwann sieht man seine eigenen Fehler ja nicht mehr).
Im Erfolgsfall lautet die Rückgabe:
Im Fehlerfall, z.B. bei unbekanntem Nutzernamen:
Ich hatte das über die Adresszeile des Browsers alles ausprobiert und bekam auch immer das erwartete Ergebnis. Also ging ich davon aus, dass ich ja nur abfragen muss, welcher Schlüssel im Rückgabe-Array enthalten ist, "status" oder "postalCodes", um dann entweder die gültigen Daten auszulesen oder in die Fehlerbehandlunc zu gehen.
Leider unterscheidet sich, wie ich jetzt weiß, die Rückgabe, wenn ich das aus einem php-Skript heraus mache, dann bekomme ich im Fehlerfall nämlich nicht diese Statusmeldung in der Variablen '$json', sondern diese hat den Wert 'false'.
Für diesen Fall habe ich jetzt den Code ergänzt:
Die Ausgabe sieht dann so aus:
Es wird also Inhalt zurückgegeben, der in Typ (s. Header[7]) und Länge (s. Header[5] => ... 56) mit der obigen Statusmeldung übereinstimmt.
Aber jetzt bin ich an dem Punkt, an dem ich mich im Kreis drehe und einen kleinen Schubs in die richtige Richtung brauche: Wie komme ich an diesen Inhalt heran???
Der Vollständigkeit halber hier die schmale Erklärung von Geonames.
Die Abfrage ist wie folgt geschrieben:
Code: Alles auswählen
$json_request = "http://api.geonames.org/postalCodeSearchJSON?username=" . $this->gn_username . "&style=short&postalcode=" . $postal_code . "&country=" . $country;
$json = file_get_contents($json_request);
$xml = json_decode($json, true);
Im Erfolgsfall lautet die Rückgabe:
Code: Alles auswählen
{"postalCodes":[{"adminCode2":"00","adminCode3":"03151","adminName3":"Landkreis Gifhorn","adminCode1":"NI","lng":10.7391,"countryCode":"DE","postalCode":"29378","adminName1":"Niedersachsen","ISO3166-2":"NI","placeName":"Wittingen","lat":52.72805}]}
Code: Alles auswählen
{"status":{"message":"user does not exist.","value":10}}
Leider unterscheidet sich, wie ich jetzt weiß, die Rückgabe, wenn ich das aus einem php-Skript heraus mache, dann bekomme ich im Fehlerfall nämlich nicht diese Statusmeldung in der Variablen '$json', sondern diese hat den Wert 'false'.
Für diesen Fall habe ich jetzt den Code ergänzt:
Code: Alles auswählen
if (!$json)
{
print_r($http_response_header); // Testausgabe
}
Code: Alles auswählen
Array ( [0] => HTTP/1.1 401 Unauthorized [1] => Date: Mon, 08 Jun 2020 11:54:27 GMT [2] => Server: Apache/2.4.6 (CentOS) mod_jk/1.2.41 OpenSSL/1.0.1e-fips PHP/5.4.16 [3] => Cache-Control: no-cache [4] => Access-Control-Allow-Origin: * [5] => Content-Length: 56 [6] => Connection: close [7] => Content-Type: application/json;charset=UTF-8 )
Aber jetzt bin ich an dem Punkt, an dem ich mich im Kreis drehe und einen kleinen Schubs in die richtige Richtung brauche: Wie komme ich an diesen Inhalt heran???
Der Vollständigkeit halber hier die schmale Erklärung von Geonames.