LoginSignup
19
23

More than 5 years have passed since last update.

NSURLSessionとAlamofireで、使い方を比較しつつApiを取得するテンプレ覚書

Last updated at Posted at 2016-05-21

環境

・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でも通信ができるようになる。

使うライブラリのインストール

Alamofire
SwiftyJSON

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とかを引っ張ってこれる........はず(まだ良い方法があれば是非とも!!)

・おしまい

19
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
23