Alamofireの基礎について調べました

# はじめに
Alamofireを今までなんとなくつかってたので調べました。

## 目次
1. Alamofireとは？
2. 特徴
3. 実装例
4. おまけ(各メソッド)
5. 参考文献

### Alamofireとは？
API通信するためのSwiftのライブラリ。
`URLSession`など既存のものを使いやすくしたライブラリ。

### 特徴
公式に書いてある特徴をわかりやすくまとめてみました

- **Chainable Request / Response Methods**: リクエストやレスポンスのメソッドを連鎖的(順番)に呼び出せる。
→実装例がわかりやすい例です
- **Swift Concurrency Support Back to iOS 13, macOS 10.15, tvOS 13, and watchOS 6**: iOS 13やそれ以降のOSでSwiftの非同期処理（Concurrency）がサポートされている。
→要は`async/await`をつかえるよーってこと
- **Combine Support**: Combineフレームワークを使った非同期処理がサポートされている。
→Combineが使えるよー
- **URL / JSON Parameter Encoding**: URLやJSON形式でのパラメータのエンコードが可能。
- **Upload File / Data / Stream / MultipartFormData**: ファイルやデータ、ストリーム、マルチパートフォームデータのアップロードをサポート。
- **Download File using Request or Resume Data**: リクエストを使ったダウンロードや中断したダウンロードの再開が可能。
- **Authentication with URLCredential**: URLCredentialを使った認証機能。
- **HTTP Response Validation**: HTTPレスポンスの検証機能。
→サーバーから返されたデータが正しいかどうかをチェックする機能
- **Upload and Download Progress Closures with Progress**: アップロードやダウンロードの進捗状況をクロージャで追跡できる。
- **cURL Command Output**: リクエストをcURLコマンドとして出力可能。
- **Dynamically Adapt and Retry Requests**: リクエストを動的に適応させたり、再試行する機能。
- **TLS Certificate and Public Key Pinning**: TLS証明書や公開鍵のピンニングをサポート。
- **Network Reachability**: ネットワークの到達可能性のチェック機能。
- **Comprehensive Unit and Integration Test Coverage**: ユニットテストや統合テストが包括的にサポートされている。
- **Complete Documentation**: 完全なドキュメントが提供されている。

### 実装例
Alamofireを使ったAPI通信
```swift
import Alamofire
// Alamofireを使ってAPIからデータを取得する
func fetchDataWithAlamofire(pokeName: String) {
  // リクエストURLを指定(今回適当に書いてます)
  let url = "https://pokeapi.co/api/v2/pokemon/\(pokeName)"

  // Alamofireリクエストを作成
  AF.request(url, method: .get)
    .validate() // レスポンスの検証
    .responseJSON { response in
      switch response.result {
      case .success(let json):
        // データの処理
        print("Response JSON:", json)
      case .failure(let error):
        // エラーハンドリング
        print("Error:", error)
      }
    }
}
```
めっちゃシンプルですね!`URLSession`を使って書いてたらエラー処理など長々と書く必要があるのでかなりありがたいですね！
詳細を書いていきます。

1. `AF`
`Alamofire`の略(夜のお店などではありません)。Alamofireの機能がたくさん詰まってるそうです(はなほじ)

2. `request(url, method: .get)`
直感的に`url`(エンドポイント)に`GET`でリクエストを飛ばすよってこと

3. `validate()`
データを取ってこれたかどうか判断

4. `responseJSON`
データがJSON形式で返ってきたら、そのデータを教えてね」という命令です。返ってきたJSONデータを見て、どう処理するか決めます。
Switch文でレスポンスの内容が正常であったら返ってきたレスポンスをprintし、エラーがあったらエラーをprint

AF.`したい処理`を
連鎖的,つまり連続して書いていくんですね

### おまけ
公式ドキュメントにある
```swift
let response = await AF.request("https://httpbin.org/get", interceptor: .retryPolicy)
// Automatic HTTP Basic Auth.
  .authenticate(username: "user", password: "pass")
// Caching customization.
  .cacheResponse(using: .cache)
// Redirect customization.
  .redirect(using: .follow)
// Validate response code and Content-Type.
  .validate()
// Produce a cURL command for the request.
  .cURLDescription { description in
    print(description)
  }
// Automatic Decodable support with background parsing.
  .serializingDecodable(DecodableType.self)
// Await the full response with metrics and a parsed body.
  .response
// Detailed response description for easy debugging.
debugPrint(response)
```
の各メソッドについて軽く紹介しておきます(自分も理解深めたい)

1. `authenticate(username: "user", password: "pass")`
Basic認証かかってるAPIにリクエストを飛ばすときに`username`と`password`を設定して使う

2. `cacheResponse(using: .cache)`
このデータを`cashe`として保存して次回も使えるようにしてねって記述

3. `redirect(using: .follow)`
APIから返されたデータが別の場所に移動したときに、どうするかを決める
この例だと`「データの場所が変わったときは、自動で新しい場所に移動してね」`ってこと

4. `cURLDescription { description in print(description) }:`
cURLDescriptionは、APIリクエストをcURLコマンドとして表示し、リクエストの詳細をチェック

5. `serializingDecodable(DecodableType.self)`
デコードしたいとき

### 追記
`responseJSON`だと以下の警告が出ます。
```
responseJSON(queue:dataPreprocessor:emptyResponseCodes:emptyRequestMethods:options:completionHandler:)' is deprecated: responseJSON deprecated and will be removed in Alamofire 6. Use responseDecodable instead
```
これは`responseJSON`が非推奨なので`responseDecodable`を使えよということです。
(Alamofire6から`responseJSON`が削除されるみたいですね。)

- `responseJSON`: JSON型のデータを受け取る
- `responseDecodable`デコードされたデータを受け取る

なので利便性もふくめて`responseDecodable`に慣れておいた方がいいですね。
ちなみに警告消したいだけなら`responseJSON`を`responseData`に書き換えればいけます

cURLとは...
 - cURLは、インターネットでデータを送ったり受け取ったりするためのコマンドです

### 参考文献
**公式**
https://alamofire.github.io/Alamofire/