SwiftでWebAPIにGETリクエストしてみた。
はじめに
今Swiftの勉強中で、いろいろやってみたことをまとめます。
環境
- macOS Mojave
- Xcode ver10.2.1
- Swift 5.0.1
JSONをパースしよう
APIを叩いたらJSONで返ってくる予定なので、まずJSONパースをやってみます。
仮にこんなJSONがあるとします。
user.json
[
{
"id":"A0001",
"name":"モンキー D ルフィ",
"remarks":"ゴムゴムの実の能力者"
},
{
"id":"A0002",
"name":"うずまき ナルト",
"remarks":"元落ちこぼれ忍者"
}
]
このJSONを受けるための構造体を作ります。
struct.swift
// Codableの継承を忘れないこと!
struct User: Codable {
let id: String
let name: String
let remarks: String
}
Swift4.0から標準ライブラリでJSONDecoderなるものがあるらしい。
以下のようにすると、構造体にマッピングできる。
struct.swift
// JSONDecoderはData型しか受け付けないので、文字列型から変換する。
let jsonData = jsonStr.data(using: .utf8)
// さっき定義した構造体(User)の形にデコードしてくれる!
let users = try! JSONDecoder().decode(User.self, from: jsonData!)
// 結果をコンソールに表示
for user in users {
print("id:\(user.id) name:\(user.name) remarks:\(user.remarks)")
}
/* 結果
* id:A0001 name:モンキー D ルフィ remarks:ゴムゴムの実の能力者
* id:A0002 name:うずまき ナルト remarks:元落ちこぼれ忍者
*/
Codableを継承していないと、JSONDecoderは使えないので注意。
ドキュメント
APIにGETリクエストしよう
いよいよAPIにリクエストしてみます。
WebAPIの用意は、GoogleAppsScriptで作りました。
GoogleSpreadSheetをDBみたいにするAPIを作成しました。
SwiftでGETリクエストしてみる
いろいろ格闘してこんな感じになりました。
get.swift
private func get(){
let urlString = "https:〜〜〜〜〜〜〜〜〜〜〜〜〜"
guard let url = URLComponents(string: urlString) else { return }
// HTTPメソッドを実行
let task = URLSession.shared.dataTask(with: url.url!) {(data, response, error) in
if (error != nil) {
print(error!.localizedDescription)
}
guard let _data = data else { return }
// JSONデコード
let users = try! JSONDecoder().decode([User].self, from: _data)
for row in users {
print("id:\(row.id) name:\(row.name) remarks:\(row.remarks)")
}
}
task.resume()
}
結果
あとがき
実はPOSTリクエストも作成済みなので、いずれPOSTも記事を書きます。