見出し画像

【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

記事の内容を大幅更新しています、以下もご覧ください




この記事が気に入ったらサポートをしてみませんか?