Swift

【swift3.0】APIKitとHimotokiで初めてAPI通信した時のメモ

More than 1 year has passed since last update.

今回mvcモデルでapi呼び出しにはapikitとhimotokiを使用。
初心者向けの記事が見つからなくて結構苦労したのでメモ。

APIKit:swiftからapiサーバーを叩きに行く。
Himotoki:返ってきたレスポンスのデコード。

APIKit

apikitの処理を定義

    // [GET] /api/hoge/:id
    struct GetHoge: APIRequest {
        typealias Response = Hoge

        var method: HTTPMethod = .get
        var path: String { return "api/hoge/\(self.id)" } //jsonのパスを指定
        var id: Int
        var headerFields: [String : String] //ヘッダ情報追加したい場合

        //クラス生成時に呼ばれる
        init(id: Int) {
            self.id = id
            self.headerFields = ["hoge" : "hoge!", "hoge2" : "hoge2!"]
        }
        //レスポンス受け取った時
        func response(from object: Any, urlResponse: HTTPURLResponse) throws -> Hoge {
            return try decodeValue(object) //このあとにHimotokiへ
        }
    }

apikitを呼び出してリクエスト送信

        let request = API.Request.GetHoge(id: hogeId)
        Session.send(request) { result in
            switch result {
            case .success(let hoge):


            case .failure(let error):
                logger.error(error)
            }
        }

レスポンスがapiサーバーから返ってきた後にmvcのhogeモデルにデータを格納するのにhimotokiを使用。
<|この辺の謎記号はhimotokiの決まりごと。
apiサーバー側でモデルと同じ項目数を返さない設計にした場合はオプショナル型にして回避した。
とりま動くけど本当にこんなのでいいのか不明。

import Foundation
import Himotoki

struct Hoge: Decodable {

    let id: Int
    let hoge: String

    static func decode(_ e: Extractor) throws -> Hoge {
        return try! Hoge(
            id: e <| "id",
            hoge: e <| "hoge",
        )
    }

}

himotoki決まりごと
<|  T   A value
<|? T?  An optional value
<|| [T] An array of values
<||?    [T]?    An optional array of values
<|-|    [String: T] A dictionary of values
<|-|?   [String: T]?    An optional dictionary of values

参考にした記事

http://qiita.com/Shunyama/items/22deffcec6f14bc9f47a
https://github.com/ishkawa/APIKit/issues/176
http://dev.classmethod.jp/smartphone/himotoki/