【Swift】Alamofireの導入と使い方!HTTP通信とAPI

この記事からわかること

  • SwiftAlamofire導入方法
  • HTTP通信やり方
  • API操作するには?
  • AFSessionクラス使い方

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

公式ドキュメント:Alamofire

Alamofireとは?

【Swift】Alamofireの導入と使い方!HTTP通信とAPI

AlamofireとはSwiftで使用されるHTTPネットワーキングライブラリです。ネットワーク通信に関わるリクエスト/レスポンス処理だけでなく、ファイルのアップロード、非同期処理、JSONパラメータのエンコーディング、認証機能などさまざまな特徴を持っています。

アプリでの使い所としてはAPI通信(Qiitaの記事やGitHubのリポジトリの取得)などによく活用されています。

ちなみにAlamofireでアラモファイアと読み、言葉の由来はテキサス州の公式州花になっている花の名前のようです。

Alamo Fire Lupinus texensis (マメ科)

APIとは?

そもそもAPIとは「Application Programming Interface」の略称でアプリやプログラム、Webサービス同士を繋ぐインターフェースのことを指します。

サービス同士を繋ぐ形で提供されているものはAPIと呼ばれますが今回はWeb上からJSON形式でデータを受け取り、アプリ内で参照するために使用するようなAPIを使用していきます。

Xcodeでの導入

Alamofireは普通のライブラリ同様にCocoaPodsやSwift Package Managerなどのツールを利用してXcodeに導入することが可能です。

CocoaPods


pod 'Alamofire'

Swift Package Manager

https://github.com/Alamofire/Alamofire.git
【Swift】Alamofireの導入と使い方!HTTP通信とAPI

Xcodeにライブラリを導入できたら使用するファイルの上部でimportしておきます。

import Alamofire

APIの取得方法

では実際にHTTPリクエストを送信し、APIからデータを取得してみます。今回は当サイト「Webエンジニア学習部屋」の記事を全て取得するAPIにアクセスしてみたいと思います。

上記のURLを叩いて取得できるのはJSON形式の文字の羅列です。これを任意の形に変換することでアプリ内から操作しやすいようにしていけばOKです。今回の変換部分はAlamofireとは関係ないので通信部分に焦点を当てて実装してみます。

import SwiftUI
import Alamofire

struct AlamofireView: View {
    
    func getArticles(){
        AF.request("https://appdev-room.com/api/article").response { response in
                do {
                    let articles = try JSONSerialization.jsonObject(with: response.data!, options: []) as? Array<Any>
                    print(articles)
                } catch {
                    print(error.localizedDescription)
                }
            }
        
    }
    
    var body: some View {
        Button {
            getArticles()
        } label: {
            Text("get")
        }
        
    }
}

AlamofireでのHTTP通信

実際に通信部分を行っているのが以下の部分です。AlamofireではAF.request()リクエストを送信しています。responseからそのレスポンスに参照することが可能です。

AF.request("https://appdev-room.com/api/article").response { response in
  //
}

AF(Session.default)

AFの定義を見てみると実態はSessionクラスのようです。defaultプロパティはシングルトンになるようにSessionインスタンスが格納されています。

public let AF = Session.default
open class Session {
    /// Shared singleton instance used by all `AF.request` APIs. Cannot be modified.
    public static let `default` = Session()
}

requestメソッド

実際にリクエストを送信したのはrequestメソッドです。これはSessionクラスに定義されているメソッドで引数にURLやHTTPメソッド、パラメータを渡すことで任意のリクエストを送信することが可能になっています。


open class Session {
  open func request(_ convertible: URLConvertible,
                      method: HTTPMethod = .get,
                      parameters: Parameters? = nil,
                      encoding: ParameterEncoding = URLEncoding.default,
                      headers: HTTPHeaders? = nil,
                      interceptor: RequestInterceptor? = nil,
                      requestModifier: RequestModifier? = nil) -> DataRequest {
        let convertible = RequestConvertible(url: convertible,
                                            method: method,
                                            parameters: parameters,
                                            encoding: encoding,
                                            headers: headers,
                                            requestModifier: requestModifier)

        return request(convertible, interceptor: interceptor)
    }
}

使用例

let url = "http://www.xxx.com/api"
AF.request(url, method: .get, parameters: params).response { response in }

JSON形式のデコーティング

取得したJSON形式のデータは必要に応じてSwiftで扱いやすいデータ型に変換します。先ほどはJSONSerializationクラスを使用して配列型に変換することで出力していました。

let articles = try JSONSerialization.jsonObject(with: response.data!, options: []) as? Array<Any>

構造体(クラス)に変換する

辞書型ではなく、構造体(orクラス)に変換するにはJSONDecoderクラスを利用します。詳細は以下の記事を参考にしてください。

構造体に変換するポイント

変換対象となるモデル構造体(orクラス)を先に定義しておきます。

モデル構造体の作成

struct Article: Decodable{
    let id:Int
    let title:String
}

JSONDecoderクラスによる変換

AF.request("https://appdev-room.com/api/article")
.responseData { response in
    do {
        let decoder: JSONDecoder = JSONDecoder()
        let articles: [Article] = try decoder.decode([Article].self, from: response.data!)
        print(articles)
    } catch {
        print(error.localizedDescription)
    }
}

SwiftオリジナルのHTTP通信クラス

ライブラリではなくSwiftに既に組み込まれているURLSessionクラスでもHTTP通信が可能になっています。

Alamofireを使用した処理もURLSessionクラスを用いて以下のように記述することも可能です。

func getArticleAPI() {
              

    let urlString = "https://appdev-room.com/api/article"
    // 有効なURLかをチェック
    if validationUrl(urlString: urlString) == false {
        return
    }
    guard let url = URL(string: urlString) else {
        return
    }
    // リクエストを構築
    let request = URLRequest(url: url)
    
    // URLにアクセスしてレスポンスを取得する
    URLSession.shared.dataTask(with: request) { data, response, error in
    
        if let data = data {
            do {
                let articles = try JSONSerialization.jsonObject(with: data, options: []) as? Array<Any>
                print(articles)
            } catch {
              print(error.localizedDescription)
            }
        } 
    }.resume()
    
}

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index