관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 4. 서버 - Alamofire를 이용한 회원가입 요청, 응답 본문

iOS 실전 (swift)/서버

[iOS - swift] 4. 서버 - Alamofire를 이용한 회원가입 요청, 응답

jake-kim 2020. 4. 24. 23:56

1. API문서

- rubypaper API사용

항목 내용
API 명 Join API
설명 사용자 정보를 입력받아 계정 생성
API 도메인

http://swiftapi.rubypaper.co.kr:2029/userAccount/join

API 경로 userAccount/join
전송방식 POST
인증헤더유무 NO
요청값

{

 "account":사용자 계정(@를 포함한 이메일 형식),

 "passwd" : 비밀번호,

 "name" : 이름

 "profile_image" :프로필 이미지(Base64로 인코딩된 바이너리 데이터)

}

응답값

{

 "result_code" : 성공이면 0, 그 이외에는 오류코드,

 "result" : 성공은 SUCCESS, 실패는 FAIL,

 "error_msg" : 처리 결과에 대한 텍스트 메시지,

 "user_info" : 계정에 등록된 사용자 정보 회신

}

 

2. 구현

주의사항 - falg값(해당 변수명은 isCalling)을 주어서 사용자가 서버에 중복해서 요청하는 것을 방지

- Alamofire를 통해 REQ와 RES하는 것이 핵심

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// HTTP
@IBAction func submit(_ sender: Any) {
    if(isCalling) {
        alert.alert(vc: self, title: "loading.. please wating for REQ")
        return
    }
    self.isCalling = true
    
    let profile = self.profile.image!.pngData()?.base64EncodedString()
    self.indicatorView.startAnimating()
    
    // Parameters 타입(Alamofire프레임 워크에 있는 딕셔너리 자료형) : [String : Any]
    // self.field는 각각 로그인 창에 입력하는 텍스트필드
    let param: Parameters = [
        "account" : self.fieldAccount.text!,
        "passwd" : self.fieldPassword.text!,
        "name" : self.fieldName.text!,
        "profile_image" : profile!
    ]
    
    // REQ
    let url = "http://swiftapi.rubypaper.co.kr:2029/userAccount/join"
    let req = Alamofire.request(url, method: .post, parameters: param, encoding: JSONEncoding.default)
    
    // RES
    req.responseJSON {res in
        self.indicatorView.stopAnimating()
        self.isCalling = false
        
        guard let jsonObj = res.result.value as? [String: Any] else {
            // alert는 UIAlertController이용하여 직접 구현한 프레임워크 사용
            self.alert.alert(vc: self, title: "error in server calling REQ")
            return
        }
        let resultCode = jsonObj["result_code"as! Int
        if resultCode == 0 {
            self.alert.alert(vc: self, title: "success the sign up")
        } else {
            self.alert.alert(vc: self, title: "failed the sign up) msg = \(jsonObj["error_msg"]!)")
        }    
    }    
}
 
 

 

※ 로그인 했을 경우, 실패한 경우와 성공한 경우 나누어서 코딩하려면, 함수를 매개변수로 넣기

1
2
3
4
5
6
7
8
9
10
    func login(account: String, passwd: String, success: (()->Void)? = nil, fail: ((String)->Void= nil) {
         //...
    
        // 실패한 경우
        fail?("error, because...")
 
        // 성공한 경우
        success?()
           
    }
 
 

단, fail에서의 String인수가 들어가는 이유는 오류타입에 대한 메시지를 표현하기 위함

Comments