技術情報

Swift4からWebAPIを呼び出す【iOSアプリ/Xcode9】

Swift4からWebAPIを呼び出す【iOSアプリ/Xcode9】
この記事は、iOSアプリからWebAPI(RESTAPI)ってどうやって呼び出すの?という疑問に答えます。

以前紹介したWebAPIをiOSアプリから呼び出すアプリをSwift4/Xcode9環境で作ってみます

アプリの概要

今回はSwift4/Xcode9を使って、WebAPIの呼び出しアプリの作り方を紹介します。

フレームワークを使用したサンプルも数多く紹介されていますが、本記事では可能な限りシンプルな構成で紹介したいと思います。

mBaasの普及もあってバックエンドに関するコーディングは楽になりました。
しかしながら既存システムやアプリケーションとのデータ連動に関しては、WebAPIの利用した接続方法は有効な手段です。

下記に構成やポイントを紹介していきます。

システム構成

下記のイメージ図のようにiOS用アプリより、以前作成したWeb RestAPIを呼び出します。

Swift4からWebAPIを呼び出す【iOSアプリ/Xcode9】-システム構成図

呼び出し元となるWebAPIに関する記事はこちら

WebAPIで認証【PHP】Slimフレームワークで認証処理の追加法! この記事は、SlimフレームワークでWebAPI化したけど、認証ってどうするの?に答えます。 Slimフレームワークのミドルウェア...

紹介動画

今回はブログで解説しているアプリをYoutubeで紹介してます。

前提条件

Swift4
Xcode9

ソース解説

サンプルのソースを解説します。
主なポイントとしては下記の2つです。

  • JSONパースにCodableを使用
  • WebAPIのHeader追加/URLSessionでの呼び出し

JSONパースにCordableを使用

WebAPIをJSONで受け取る為のパース用Codableクラスを宣言します。

Codableのパース用クラス宣言

Codableクラスを継承したクラス宣言を行います。

struct JsonSample: Codable{
    var cityName: String
    var hollAddress: String
    var zipCode: String
    var tel: String
    var link: String
    var tau: Float
    var cx: Float
    var cy: Float
}

Codableデコードメソッド呼び出し

CodableクラスのパースクラスにJSON文字列を渡しdecodeメソッドを呼び出します。

let json = try? JSONDecoder().decode(JsonSample.self, from: sample.data(using: .utf8)!)

WebAPIのHeader追加/URLSessionでの呼び出し

今回使用するWebAPIに合わせて、Headerキーの追加を行います。
URLSessionクラスのdataTaskメソッドに渡すURLRequestクラスのHeaderへAPIキーを渡します。

URLRequestクラス宣言

URLRequestクラスのaddValueメソッドでHeaderキーを追加します。

    // API呼び出し時の認証用Headerキーを追加する
    let apiUrl = URL(string: text)!
    var request = URLRequest(url: apiUrl)
    request.addValue("AUTH_API_KEY_20181203", forHTTPHeaderField: "H-API-KEY")
    request.httpMethod = "GET"

URLSession.dataTaskメソッド呼び出し

dataTaskメソッドのerrオブジェクトのnil判定で通信に関する成功/失敗を判断します。

    // APIに接続
    URLSession.shared.dataTask(with: request) {data, response, err in
        if (err == nil) {
                // API通信成功
            } else {
                // API通信失敗
            }
        }.resume()        
    }

ソース全文

上記ポイントを踏まえて、ViewController.swiftファイルの全ソースは下記の通りです。

import UIKit

struct JsonSample: Codable{
    var cityName: String
    var hollAddress: String
    var zipCode: String
    var tel: String
    var link: String
    var tau: Float
    var cx: Float
    var cy: Float
}

class ViewController: UIViewController {

    @IBOutlet weak var name: UITextField!
    @IBOutlet weak var lblname: UILabel!
    @IBOutlet weak var lblzip: UILabel!
    @IBOutlet weak var lbltel: UILabel!
    @IBOutlet weak var lblcx: UILabel!
    @IBOutlet weak var lblcy: UILabel!
    @IBOutlet weak var lblzm: UILabel!
    @IBOutlet weak var contact: UITextView!
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.contact.text = ""
        self.lblname.text = ""
        self.lblzip.text = ""
        self.lbltel.text = ""
        self.lblcx.text = ""
        self.lblcy.text = ""
        self.lblzm.text = ""
    }

    @IBAction func sendApi(_ sender: Any) {
 
        // 未入力時には「豊田市」をデフォルト設定にする
        let city:String = self.name.text!
        var text = "https://ssit.jp/api/holls/" + (city == "" ? "豊田市" : city)
        text = text.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)!

        // API呼び出し時の認証用Headerキーを追加する
        let apiUrl = URL(string: text)!
        var request = URLRequest(url: apiUrl)
        request.addValue("AUTH_API_KEY_20181203", forHTTPHeaderField: "H-API-KEY")
        request.httpMethod = "GET"
        
        // APIに接続
        URLSession.shared.dataTask(with: request) {data, response, err in
            if (err == nil) {
                // API通信成功
                let sample = String(data: data!, encoding: .utf8)!
                
                let json = try? JSONDecoder().decode(JsonSample.self, from: sample.data(using: .utf8)!)
                
                DispatchQueue.main.async {
                    self.contact.text = json?.hollAddress
                    self.lblname.text = json?.cityName
                    self.lblzip.text = json?.zipCode
                    self.lbltel.text = json?.tel
                    self.lblcx.text = json?.cx.description
                    self.lblcy.text = json?.cy.description
                    self.lblzm.text = json?.tau.description
                }

            } else {
                // API通信失敗
                self.contact.text = "error"
            }
        }.resume()        
    }
}

まとめ

Swift4で実装されたCodableを使用することでWebAPIの呼び出しもシンプルにコーディングすることが可能になりました。

WebAPIでのマイクロ資産は今後の戦略やサービス更新にも役立ちます。

既存システムとのデータ連動に、他社製APIやサービスとの結合にご利用下さい。