Hallo zusammen,
ich habe eine Frage zu einer Problemstellung die ich letztendlich durch ein Stück Code gelöst habe was ich bei Stackoverflow zu dem Thema gefunden habe und für mich etwas angepasst. Allerdings war das noch Swift 3 und jetzt bin ich mir nicht sicher ob das nicht doch irgendwie eleganter/besser geht?
Problem:
Ich hole mit JSON Daten über eine URL um diese dann zu Parsen. Wenn aber z.B. der Webservice nicht verfügbar ist, bekomme ich keinen Error aber eine andere Response, was dazu führt das der JSON Decode "auf die Bretter geht". Ich habe also nach einer Lösung gesucht den WebService Response Status zu checken bevor ich das Parsen starte.
Hier mal meine, oder besser, die gefundene Lösung, auf meine Bedürfnisse angepasst:
Alles anzeigen
So wie ich es verstehe ist die Idee die URLResponse um eine Methode zu erweitern die den HTTP response Code liefert. Diesen überprüfe ich und das Parsen wird nur gestartet bei == 200 (OK).
Mir ist klar das es immer mehrere Wege gibt, mich würde aber Eure Experten Meinung zu dieser Lösung interessieren, da das für einen Anfänger immer sehr hilfreich ist
Gruß
Ralf
ich habe eine Frage zu einer Problemstellung die ich letztendlich durch ein Stück Code gelöst habe was ich bei Stackoverflow zu dem Thema gefunden habe und für mich etwas angepasst. Allerdings war das noch Swift 3 und jetzt bin ich mir nicht sicher ob das nicht doch irgendwie eleganter/besser geht?
Problem:
Ich hole mit JSON Daten über eine URL um diese dann zu Parsen. Wenn aber z.B. der Webservice nicht verfügbar ist, bekomme ich keinen Error aber eine andere Response, was dazu führt das der JSON Decode "auf die Bretter geht". Ich habe also nach einer Lösung gesucht den WebService Response Status zu checken bevor ich das Parsen starte.
Hier mal meine, oder besser, die gefundene Lösung, auf meine Bedürfnisse angepasst:
Brainfuck-Quellcode
- // Erweiterung zu URLResponse Klasse, damit in der Data Session auf den Response Code abgefragt werden kann.
- // != 200 --> Error und kein JSON Parsing ausführen.
- extension URLResponse {
- func getStatusCode() -> Int? {
- if let httpResponse = self as? HTTPURLResponse {
- return httpResponse.statusCode
- }
- return nil
- }
- }
- // API Endpoint: https://free.currconv.com/api/v7/convert?q=USD_EUR,EUR_USD&compact=ultra&apiKey=123456789
- // Reference: https://www.currencyconverterapi.com
- let urlString = "https://free.currconv.com/api/v7/convert?q=USD_EUR,EUR_USD&compact=ultra&apiKey=123456789"
- let url = URL(string: urlString)
- let session = URLSession.shared
- let dataTask = session.dataTask(with: url!) { (data, reponse, error) in
- // check for HTTP response code
- if let statusCode = reponse?.getStatusCode() {
- if statusCode != 200 {
- print("HTTP Response Error: \(statusCode)")
- return
- }
- }
- // check for errors
- if error == nil && data != nil {
- // parse json
- do {
- // Aktuelles Abfrage Datum ermitteln und formatieren
- // Referenz: https://www.ralfebert.de/ios/swift-dateformatter-datumsangaben-formatieren/
- let formatter = DateFormatter()
- formatter.locale = .init(identifier: "de")
- formatter.dateStyle = .full
- formatter.timeStyle = .full
- let dateFormattedString = formatter.string(from: Date())
- print("Abfrage@ \(dateFormattedString)")
- let currency: Currency = try! JSONDecoder().decode(Currency.self, from: data!)
- print ("1€ = \(currency.EUR_USD)$")
- print ("1$ = \(currency.USD_EUR)$")
- print("------------------------------------------------------------------------------")
- print ("This is JSON result --> \(currency)")
- }
- }
- }
- dataTask.resume()
Mir ist klar das es immer mehrere Wege gibt, mich würde aber Eure Experten Meinung zu dieser Lösung interessieren, da das für einen Anfänger immer sehr hilfreich ist
Gruß
Ralf