AFNetworkのSwift版 Alamofireを試してみた



![alamofire.png](https://qiita-image-store.s3.amazonaws.com/0/4943/637b0b25-9879-30ab-6891-2faa49207bc5.png "alamofire.png")

[Alamofire](https://github.com/Alamofire/Alamofire)はSwiftで書かれたHTTPネットワークライブラリです。作者は[AFNetworking](https://github.com/AFNetworking/AFNetworking)のメインコミッターとしても有名な[Mattt](https://github.com/mattt)さんです。９月７日時点でまだ21コミットほどしかありませんが、GitHubスターも３５００ほどあり、機能としても実用十分なものを備えています。コードを見てみるとSwiftのパワフルな特性と活かした非常に簡素で可読性の高い記述がされています。コードも１０００行ほどでSwiftの勉強教材としても大変役に立つかと思います。


## 機能

以下の機能があります。AFNetworkingにあるUIImageViewの拡張はありません。

- Chainable Request / Response methods
- URL / JSON / plist Parameter Encoding
- Upload File / Data / Stream
- Download using Request or Resume data
- Authentication with NSURLCredential
- Progress Closure & NSProgress
- cURL Debug Output

## 必要環境 

- Xcode 6 Beta 6
- iOS 7.0+ / Mac OS X 10.9+

## インストール

- Alamofire.xcodeprojをプロジェクトにドラッグして追加します
- Build PhasesのTarget DependenciesにAlamofireを追加します


![スクリーンショット 2014-09-07 12.57.26.png](https://qiita-image-store.s3.amazonaws.com/0/4943/2ab57368-532e-3313-e289-3d6ccf45ba44.png "スクリーンショット 2014-09-07 12.57.26.png")

- AlamofireをImportします

```
import Alamofire
```

![スクリーンショット 2014-09-07 13.03.47.png](https://qiita-image-store.s3.amazonaws.com/0/4943/390d1562-67e2-f251-832a-4e6a2d59416d.png "スクリーンショット 2014-09-07 13.03.47.png")

以上で利用できる状態となります。


## 使い方

Alamofireの使い方の一部抜粋です。そのたはAlamofireの[README](https://github.com/Alamofire/Alamofire)をご確認ください。

### GET Request

Alamofireのリクエストオブジェクトを作成します。

```swift
Alamofire.request(.GET, "http://httpbin.org/get")
```

#### With Parameters

リクエストパラメーターをセットします。

```swift
Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"])
```

#### With Response Handling

リクエストオブジェクトのレスポンスメソッドをコールすると非同期通信が開始され、完了時にクロージャが実行されます。

```swift
Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"])
         .response { (request, response, data, error) in
                     println(request)
                     println(response)
                     println(error)
                   }
```

#### With Response String Handling

レスポンスをStringで受け取りたい場合は、responseStringをコールします。

```swift
Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"])
         .responseString { (request, response, string, error) in
                  println(string)
         }
```
### HTTP Methods

RFC 2616 に定義されている HTTP methods がenumとして利用できます。

```swift
public enum Method: String {
    case OPTIONS = "OPTIONS"
    case GET = "GET"
    case HEAD = "HEAD"
    case POST = "POST"
    case PUT = "PUT"
    case PATCH = "PATCH"
    case DELETE = "DELETE"
    case TRACE = "TRACE"
    case CONNECT = "CONNECT"
}
```


```swift
Alamofire.request(.POST, "http://httpbin.org/post")

Alamofire.request(.PUT, "http://httpbin.org/put")

Alamofire.request(.DELETE, "http://httpbin.org/delete")
```

### POST Request

POSTリクエストはDictionary形式でパラメーターを渡すと、自動的にリクエストボディにセットして送信してくれます。

```swift
let parameters = [
    "foo": "bar",
    "baz": ["a", 1],
    "qux": [
        "x": 1,
        "y": 2,
        "z": 3
    ]
]

Alamofire.request(.POST, "http://httpbin.org/post", parameters: parameters)
```


```
foo=bar&baz[]=a&baz[]=1&qux[x]=1&qux[y]=2&qux[z]=3
```


### Parameter Encoding

パラメーターエンコーディングを変更することでJSON形式でリクエストパラメーターを送ることもできます。

```swift
enum ParameterEncoding {
    case URL
    case JSON(options: NSJSONWritingOptions)
    case PropertyList(format: NSPropertyListFormat,
                      options: NSPropertyListWriteOptions)

    func encode(request: NSURLRequest,
                parameters: [String: AnyObject]?) ->
                    (NSURLRequest, NSError?)
    { ... }
}
```


### POST Request with JSON Response

JSON形式で受領したレスポンスをでシリアライズしてDictionary形式で受け取る方法です。リクエストに対してresponseJSONをコールします。

```swift
Alamofire.request(.POST, "http://httpbin.org/post", parameters: parameters, encoding: .JSON(options: nil))
         .responseJSON {(request, response, JSON, error) in
            println(JSON)
         }
```

#### Built-In Response Methods

レスポンス形式は以下のように選択できます。

- `response()`
- `responseString(encoding: NSStringEncoding)`
- `responseJSON(options: NSJSONReadingOptions)`
- `responsePropertyList(options: NSPropertyListReadOptions)`


## License

Alamofire is released under an MIT license. See LICENSE for more information.

## まとめ

Swiftらしい記述で手軽にHTTP通信が行えます。作者も実績のあり著名な[Mattt](https://github.com/mattt)さんなので安心です。
Swiftのコードレーディングにも大変おすすめな実装です。自分も大変勉強になりました。