083_Network(signup, login)

2022. 11. 2. 20:15SeSAC/수업정리

 

-. 회원가입 시 네트워크통신으로 회원정보를 서버에 저장(signup->server)

-. 로그인 시 네트워크통신에 성공하면(입력한 정보가 저장된 회원정보와 일치하면) 토큰발급(login->server)

-. 토큰을 Userdefaults 통해 사용자정보 헤더에 넣어서 화면전환할때마다 로그인 할 필요없도록 함.

 

코드축약 전

-. 네트워크 통신에 필요한 요소를 각각 선언(url, header, parameter)

func login() {
        let url = "http://api.memolease.com/api/v1/users/login"
        let header: HTTPHeaders = ["Content-Type": "application/x-www-form-urlencoded"]
        let parameter = ["email": "testTJ@test.com",
                         "password": "12345678"]
        AF.request(url, method: .post, parameters: parameter, headers: headers).validate(statusCode: 200...299).responseDecodable(of: Login.self) { response in
            switch response.result {
            case .success(let data):
                print(data.token) //통신성공하면 디코딩한 내용으로 출력 가능
                UserDefaults.standard.set(data.token, forKey: "token") //프로필정보 헤더에 넣어주기 위해 토큰값 저장
            case .failure(_):
                print(response.response?.statusCode)
            }
        }
    }

 

코드축약 후

-. 열거형+익스텐션으로 참조파일을 만든 뒤 인스턴스 생성(let api)

-. 인스턴스 통해 익스텐션 연산프로퍼티에 접근(api.url, api.parameter 등)

-. parameter는 저장할 회원정보이기 때문에 고정값이면 안되므로 다양한 정보를 저장할 수 있도록 열거형 연관값 사용

enum SeSACAPI {
    case login(email: String, password: String)
}

extension SeSACAPI {
    var url: URL {
        switch self {
        case .login:
            return URL(string: "http://api.memolease.com/api/v1/users/login")!
        }
    }
    
    var headers: HTTPHeaders {
        switch self {
        case .signup, .login:
            return ["Content-Type": "application/x-www-form-urlencoded"]
        }
    }
    
    var parameter: [String: String] {
        switch self {
        case .login(email: let email, password: let password):
            return ["email": email,
             "password": password]
        default: return ["": ""]
        }
    }
}
//로그인 성공하면 발급되는 토큰을 ud에 저장해서 사용자정보 헤더에 포함시킴
    func login() {
        let api = SeSACAPI.login(email: "testTJ@test.com", password: "12345678")
        AF.request(api.url, method: .post, parameters: api.parameter, headers: api.headers).validate(statusCode: 200...299).responseDecodable(of: Login.self) { response in
            switch response.result {
            case .success(let data):
                print(data.token) //통신성공하면 디코딩한 내용으로 출력 가능
                UserDefaults.standard.set(data.token, forKey: "token") //프로필정보 헤더에 넣어주기 위해 토큰값 저장
            case .failure(_):
                print(response.response?.statusCode)
            }
        }
    }