【Swift】URLSessionの書き方について【API通信】
URLSessionでHTTP通信を行う方法を備忘録として記録しておきます。
Objective-C(Swiftと比較するとレガシーな言語)の時代もなんだかんだ3ヶ月に1回はエラーハンドリング込みで書き直してテンプレ更新していたんですよね。
なので、今回はこれだけでOKみたいな要素を詰め込んでメモしておきます。
// JSONの結果をデコードする為のクラス Decobableクラスを継承するとstruct/classをデコード可能にする。
struct UsersInfo : Decodable {
var id : Int
var name : String
}
// http:~からはご自由に変更してください。
let url = URL(string: "http://www.json-generator.com/api/json/get/bQIUnAqOKW?indent=2")! //URLを生成
let task = URLSession.shared.dataTask(with: url, completionHandler: { data , response, error in
if let error = error {
print(error.localizedDescription)
print("通信が失敗しました")
return
}
guard let data = data,
let response = response as? HTTPURLResponse else {
print("データもしくはレスポンスがnilの状態です")
return
}
if response.statusCode == 200 {
// パターン1
// 結果:通信結果のJSONをStringで得る。 -> { "id": 1, "name": "GOOD" }
print(String(data: data, encoding: .utf8)!)
// パターン2:JSON形式を構造体(Struct)に変換して使用する
do {
// 結果:UserInfo構造体(Struct)を取得できる -> UserInfo
let user = try JSONDecoder().decode(UsersInfo.self, from: data)
} catch let error {
print(":エラー:\(error)") // JSONの値がIDがIntなのに、StructでIDをStringと宣言している時などエラーになる。
}
// パターン3:Dictionary(辞書)型に変換して使用する
do {
let object = try JSONSerialization.jsonObject(with: data, options: []) as! Dictionary<String, Any>
print(object["id"] as! Int) // 辞書型に変換したJSONから値id(Int)を取り出す。
print(object["name"] as! String) // 辞書型に変換したJSONから値name(String)を取り出す。
} catch let error {
print(error)
}
} else {
print("statusCode:\(response.statusCode)")
}
}).resume()
参考
こちらの記事を参考に複合的に組み合わせました。
https://www.youtube.com/watch?v=389cPELaHJU&t=1529s
記事の内容を大幅更新しています、以下もご覧ください