環境
・Xcode7.3
目的
・NSURLSessionとalamofireでhttp通信の感覚を掴むために天気apiであるOpenWeatherMapを使って、天気を取得、表示するapiを作ってみることにした
・両方やるのはなにやらものによっては(?)Alamofireで取得できないものがあるらしいので(最もこの例ではPOSTみたいですが........)、その場合にNSURLSessionでやろうと思ったため(取得できないらしい例)
今回のゴール
・アプリを開いたらapiに自動でアクセスして、情報を引っ張ってきてくれるようにする
・今回のapiはお天気apiのOpenWeatherMapを使用した。
準備
info.plistでhttp通信の許可を行う
・初めての時にはこのことを知らずに通信できないと嘆いていた。
・普段はiOSではATS(App Transport Security)なるものがかかっていて、http通信を許可してもらえない。
・なのでこの設定(App Transport Security Settingsより下)を手打ちで実装してあげることで、http通信を使うapiでも通信ができるようになる。
使うライブラリのインストール
OpenWeatherMapのキー取得
・去年の10月からapi情報を得るのにキーがいるようになったみたい
・公式サイトへ行って登録すればゲットできる。無料。
・取得するには
東京の場合
http://api.openweathermap.org/data/2.5/weather?q=Tokyo&appid=[apiキー]
緯度経度で取得する場合は
http://api.openweathermap.org/data/2.5/forecast/daily?lat=[緯度]&lon=[経度]&appid=[apiキー]
で手にはいる
・今回は上の東京の天気を取得するリクエストを出す
実装
URLリクエストをする関数を作る①(NSURLSession Ver)
import UIKit
import SwiftyJSON
//中略
override func viewDidLoad() {
super.viewDidLoad()
//関数実行
getArticle()
}
func getArticle(){
//URLの材料
let APIKey: String = "apiキー"
let urlString: String = "http://api.openweathermap.org/data/2.5/weather?q=Tokyo&appid=\(APIKey)"
//URLをStringからNSURL型に
let url = NSURL(string: urlString)!
//アクセスするタスクを実行
let task = NSURLSession.sharedSession().dataTaskWithURL(url){
//渡ってくる変数群。重要なデータは文字通りdataの中に
(data,response,error) in
//中身が入っているかどうかをフィルタリング
guard let data = data else{return}
//dataを扱いやすいようにJSON化
let json = JSON(data: data)
//output!!
print(json)
}
//タスクを実行
task.resume()
}
URLリクエストをする関数を作る②(Alamofire Ver)
import UIKit
import SwiftyJSON
import Alamofire
//中略
override func viewDidLoad() {
super.viewDidLoad()
//関数実行
getArticle()
}
func getArticle(){
//URLの材料
let APIKey: String = "apiキー"
let urlString: String = "http://api.openweathermap.org/data/2.5/weather?q=Tokyo&appid=\(APIKey)"
//alamofire版のリクエスト。
//こっちはわざわざNSURLにする必要はない
Alamofire.request(.GET, urlString).responseJSON{
//こっちは一つの変数だけでいい
(response) in
//ただしこちらはresponseの中のresultのvalueの中に必要な情報が入ってくる
guard let object = response.result.value else{return}
//dataを扱いやすいようにJSON化
let json = JSON(object)
//output!!
print(json)
}
//task.resume()的なものは存在しない........
}
まとめ
・こうしてみると改めてalamofire便利ですね。
・これを使いまわせば基本どちらかでapiとかを引っ張ってこれる........はず(まだ良い方法があれば是非とも!!)
・おしまい