swift Alamofire login 忘備録

Alamofireはswiftyjsonと一緒に使うことが多い

Alamofireは、セッション等通信に利用する。

swiftyjsonは 受け取ったjsonレスポンスをswiftに取り込むためと考える。

理由は、jsonのファイルには、配列やオブジェクトが混じっていることが多いが、それをきれいに取り出してくれる仕組みがある。

ここのイニシャライザがわかりやすい。 github.com

SwiftyJSONの使い方

import SwiftyJSON

//こんな感じで利用
let json = JSON(data: dataFromNetworking)

let json = JSON(jsonObject)

Alamofire(アラモファイアー)のリクエストはこちら

github.com

Alamofireのリクエスト例

func request<Parameters: Encodable>(_ convertible: URLConvertible,
                                         method: HTTPMethod = .get,
                                         parameters: Parameters? = nil,
                                         encoder: ParameterEncoder = URLEncodedFormParameterEncoder.default,
                                         headers: HTTPHeaders? = nil,
                                         interceptor: RequestInterceptor? = nil) -> DataRequest

で実際のコード

//ログインを実装するよ
//@escapingは非同期や、他で参照される可能性があるということ。ここでは非同期のため。
   func login(userType: String, completionHandler: @escaping (NSError?) -> Void) {
        
     //パラメータ requestを生成するため
        let path = "api/social/convert-token/"
        let url = baseURL!.appendingPathComponent(path)
        let params: [String: Any] = [
            "grant_type": "convert_token",
            "client_id": CLIENT_ID,
            "client_secret": CLIENT_SECRET,
            "backend": "facebook",
            "token": AccessToken.current?.tokenString,
            "user_type": userType
        ]
        
//ここはリクエストなので、Alamofireを利用
       let request = Alamofire.request(url!,
                          method: .post,
                          parameters: params,

//ここはAlamofireのURLEncoding()を使うよ
                          encoding: URLEncoding(),
                          headers: nil)

        //投げたリクエストに対してのレスポンス処理 swiftyjson
        request.responseJSON { (response) in

//responseは .success と .failureが返却されるので、切り分ける
            switch response.result {

//レスポンスが帰ってきたときの処理
            case .success(let value):
                
//ここで上記のイニシャライザを利用
                let jsonData = JSON(value)
       
//.string!だけで string型にしてくれるだけでなく、nilのときは、そのまま空白を返却してくれる。落ちないので良い     
                self.accessToken = jsonData["access_token"].string!
                self.refreshToken = jsonData["refresh_token"].string!

//セッションが切れるときは、レスポンスのexpires_inに入っているよ
                self.expired = Date().addingTimeInterval(TimeInterval(jsonData["expires_in"].int!))
                completionHandler(nil)
                break

//だめだったときは、エラーをはく。チェックのため。
            case .failure(let error):
                completionHandler(error as NSError)
                break
                
            }
        }