技術ブログ

プログラミング、IT関連の記事中心

APIKitのサンプル(郵便番号検索)【Swift】

■はじめに

ここでは、「APIKit」というライブラリのサンプルを記載します。
APIKitの詳細に関しては、GitHubhttps://github.com/ishkawa/APIKit)を参照してください。
APIKitの詳細を簡単に説明すると、タイプセーフにAPIを利用するためのライブラリです。
※タイプセーフとは、型変換の時に別の型を渡せない様になっているみたいなことです。(String型にInt型を設定するなどはできない)
※CocoaPodsなどを用いて、APIKitをプロジェクトに組み込んでおいてください。(ここでは組込方法は割愛します。)

また、以下のサンプルでは、郵便番号検索APIを使用したサンプルになっていますが、郵便番号検索APIには「zipcloud」(http://zipcloud.ibsnet.co.jp/doc/api)を利用しています。

■手順

まずは、APIのレスポンスを入れるためのEntityを作成します。
郵便番号検索APIのレスポンスを入れるため、以下の様に記載してください。

import Foundation

class Entity {
    var address1: String = ""
    var address2: String = ""
    var address3: String = ""
    var kana1: String = ""
    var kana2: String = ""
    var kana3: String = ""
    var prefcode: String = ""
    var zipcode: String = ""
    
    init(object: [String: AnyObject]?) throws {
        guard
            let status: Int = object?["status"] as? Int,
            status == 200,
            let results: NSArray = object?["results"] as? NSArray
        else { return }
        
        if let data = results[0] as? [String: AnyObject] {
            self.address1 = data["address1"] as? String ?? ""
            self.address2 = data["address2"] as? String ?? ""
            self.address3 = data["address3"] as? String ?? ""
            self.kana1 = data["kana1"] as? String ?? ""
            self.kana2 = data["kana2"] as? String ?? ""
            self.kana3 = data["kana3"] as? String ?? ""
            self.prefcode = data["prefcode"] as? String ?? ""
            self.zipcode = data["zipcode"] as? String ?? ""
        }
    }
}

次に、APIの本体となるDataStoreクラスを作成します。
以下の様に記載してください。
ここで、APIのURLやパラメータやHTTPメソッドなどの指定をしています。

import Foundation
import APIKit

struct DataStore: Request {
    typealias Response = Entity
    let zipcode: String

    var baseURL: URL {
        return URL(string: "http://zipcloud.ibsnet.co.jp")!
    }

    var method: HTTPMethod {
        return .get
    }

    var path: String {
        return "/api/search"
    }

    var parameters: Any? {
        return ["zipcode": zipcode]
    }
    
    func response(from object: Any, urlResponse: HTTPURLResponse) throws -> Entity {
        return try Entity(object: object as? [String : AnyObject])
    }
}

ここまで用意できたら以下の様に呼び出すだけです。
以下は、千代田区の郵便番号を利用しています。(100-0000なんて、キリがいい郵便番号だったので!)

// 東京都千代田区の郵便番号「100-0000」
let request = DataStore(zipcode: "1000000")
Session.send(request) { result in
    switch result {
    case .success(let target):
        print("=====SUCCESS=====")
        print(target.address1)
        print(target.address2)
        print(target.address3)
        print(target.kana1)
        print(target.kana2)
        print(target.kana3)
        print(target.prefcode)
        print(target.zipcode)
    case .failure(let error):
        print("error: \(error)")
    }
}