アプリを作っていて、サーバーサイドのAPIが未完成な状態で、クライアントサイドの実装を進めたいことってよくあると思います。あるある!
レスポンスの形式はなんとなく決まってるけど、APIできてないし困ったなーという時、想定されれるレスポンスをアプリのローカルで偽装できるライブラリを作ってみました。
はじめに
まず最初に強調しておきたいことは、このライブラリはHTTPリクエストに対するレスポンスを偽装するということです。
ローカルで偽装するため、どこかにサーバーを立てる必要もなく、簡単にスタブの実装を埋め込むことが出来ます。
使い方
アプリケーションが起動した時、MockProtocol.register()
を呼び出し、擬装用のプロトコルを起動します。
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
MockProtocol.register()
return true
}
その後、HTTPリクエストに対するレスポンスをどんどん定義していきましょう。
Mock.install().request(url: "/").response(200, body: nil, header: nil)
上記の例は
/
というパスにGET
リクエストを送信した際、ステータスコードが200
のレスポンスが返ってくるよ
という意味になります。もちろんPOST
,PUT
,DELETE
も定義出来ますし、Body
やHeader
の定義、400
や500
のエラーも定義できます。
通信の処理は普段通りNSURLSession
やAlamofire
で実装しましょう。
NSURLSession
let request = NSURLRequest(URL: NSURL(string: "/")!)
let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
session.dataTaskWithRequest(request) { data, response, error in
let httpResponse = response as! NSHTTPURLResponse
// Status code is 200 !!!
ex.fulfill()
}.resume()
Alamofire
Alamofire.request(.GET, "/").response { _, response, _, _ in
// Status code is 200 !!!
}
Body
レスポンスBodyの種類は以下をサポートしています
- JSON
- File
- Text (String)
- NSData
例えばJSON、Fileだと下記のように記述します。
JSON
[String: AnyObject]
をレスポンスとして返します。
let json: [String: AnyObject] = ["name": "yukiasai", "age": 28]
Mock.install().request(url: someUrl).response(200, body: JSON(json), header: nil)
File
Bundleなどに存在するファイルの中身をレスポンスとして返します。
let fileUrl: NSURL = NSURL(string: "path/to/file")!
Mock.install().request(url: someUrl).response(200, body: File(fileUrl), header: nil)
また、レスポンスを動的に生成するハンドラを定義することも可能です。
Mock.install().request(url: someUrl).response { request -> Response in
let response = NSHTTPURLResponse(URL: request.URL!, statusCode: 200, HTTPVersion: nil, headerFields: nil)!
let data = "12345".dataUsingEncoding(NSUTF8StringEncoding)
return .Success(response, data)
// or return .Failure(error)
}
Speed
通信状態を定義することでレスポンスのスピードを変えることが出来ます。
Mock.install().request(url: url)
.response(200, body: File(fileUrl), header: nil)
.speed(.Wifi)
サポートされたスピードは以下のとおりです。
public enum Speed {
case Prompt
case Wifi // 45Mbps
case Mobile4G // 10Mbps
case Mobile3G // 1Mbps
case Edge // 200kbps
case Custom(bps: Double) // Custom speed
}
終わりに
ぜひ使ってみてください!