■はじめに
ここでは、「APIKit」というライブラリのサンプルを記載します。
APIKitの詳細に関しては、GitHub(https://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)")
}
}