Swift API接続注意点2 忘備録 読まないこと!
まず、画面とRequestは分ける。
実装は疎結合にしておくのが基本
Modelのフォルダを作成した
User.swiftは、リクエストにもレスポンスにも使える、モデル構造を持っている
LoginRequest GitHubRequestを継承している。
struct LoginRequest : GitHubRequest { //これ generics typealias HTTPBody = SignInBody //他で必要 typealias Response = User //こっちはプロパティ 初期値はなくて良い getter setter持っている var httpBody: SignInBody var path: String { return "/users/sign_in.json" } var method: HTTPMethod { return .post } } struct SignInBody: Codable{ var user: UserRequest init(user: UserRequest){ self.user = user } } //Codableに準拠しているとinitializer を入れられてしまう。イニシャライザがあっても初期化できるようにvarに変更 struct UserRequest: Codable{ var email: String var password: String var remember_me = true //初期化するように変更した。 init(email:String, password: String, remember_me:Bool){ self.email = email self.password = password self.remember_me = true } } struct UserRequest: Codable{ var email: String var password: String var remember_me = true //こちらも初期化 init(email:String, password: String, remember_me:Bool){ self.email = email self.password = password self.remember_me = true }
LogInクラス Viewを主に書くところ ログインボタンが押されたときの処理
@IBAction func btn_login(_ sender: Any) { let client = GitHubClient() //ここでUserRequestを初期化するために、上記クラスにイニシャライザを設定 //jsonをパースできるように jsonは下記 下から組み立てる //この画面の入力値を利用していることに注目、なのでジェネリクスを利用する価値がある。 let userRequest = UserRequest(email: email.text!, password: password.text!, remember_me: true) let signIn = SignInBody(user: userRequest) let request = LoginRequest(httpBody: signIn) client.send(request: request){result in switch result{ case let .success(response): print (response.id) case let .failure(error): print(error) } } }
sign_in.json の形
userの下位にUserRequest つまりemail passwordなどがある。
{ "user": { "email": "admin@aaa.com", "password": "password", "remember_me": true } }