Swiftの勉強にQiitaAPIのSwiftインターフェースを作ってみました
QiitaKit
- 通信には Alamofire を利用
- Generics を用いて各リクエストレスポンスは対応したエンティティにマッピング
- リクエストは Future でラップされたエンティティを返す
- 例)
GetItem
->Future<Item>
- 例)
使い方
import QiitaKit
let Qiita = QiitaSession(
baseURL: "https://qiita.com",
clientId: "*****",
clientSecret: "*****"
)
// アクセストークンの取得
Qiita.oauthAuthorize([.ReadQiita, .WriteQiita], scheme: "callback url scheme")
.onSuccess { accessToken in
println(accessToken)
}
//条件にマッチする投稿リストの取得
let listItems = ListItems(page: "1", per_page: "20", query: "qiita user:yaotti")
Qiita.request(listItems)
.onSuccess { items, meta in
println(items)
}
.onFailure {
println($0)
}
//flatMapを使った例
Qiita.request(listItems)
.flatMap {
Qiita.request(GetItem(item_id:$0[0].id))
}
.flatMap {
...
}
API定義の例
Endpoint/Item/ListItems.swift
import Foundation
import APIKit
/**
* 投稿の一覧を作成日時の降順で返します。
*/
public struct ListItems {
/// ページ番号 (1から100まで)
/// example: 1
/// ^[0-9]+$
public let page: String
/// 1ページあたりに含まれる要素数 (1から100まで)
/// example: 20
/// ^[0-9]+$
public let per_page: String
/// 検索クエリ
/// example: qiita user:yaotti
///
public let query: String
public init(page: String, per_page: String, query: String) {
self.page = page
self.per_page = per_page
self.query = query
}
}
extension ListItems: RequestToken {
public typealias Response = ([Item], LinkMeta<ListItems>)
public typealias SerializedType = [[String: AnyObject]]
public var method: HTTPMethod {
return .GET
}
public var URL: String {
return "/api/v2/items"
}
public var headers: [String: AnyObject]? {
return nil
}
public var parameters: [String: AnyObject]? {
return [
"page": page,
"per_page": per_page,
"query": query,
]
}
public var encoding: RequestEncoding {
return .URL
}
public var resonseEncoding: ResponseEncoding {
return .JSON(.AllowFragments)
}
}
extension ListItems {
public static func transform(request: NSURLRequest, response: NSHTTPURLResponse?, object: SerializedType) -> Result<Response> {
return Result(_Items(object), LinkMeta<ListItems>(dict: response!.allHeaderFields))
}
}
インストール
Carthage
非推奨
Cartfile に以下を追加し生成される Framework をプロジェクトに追加
github "sora0077/QiitaKit"
CocoaPods
Podfile に以下を追加し pod install
を実行する
source 'https://github.com/sora0077/PodSpecs.git'
source 'https://github.com/CocoaPods/Specs.git'
pod 'QiitaKit', :git => 'https://github.com/sora0077/QiitaKit.git', :tag => "swift-2.0"