[iOS] 로그인 관련

RudinP·2024년 3월 21일
0

Study

목록 보기
204/226

HTTP Request Methods

Get

데이터만 전달해서 결과 도출

  • 목록이나 상세정보 가져올 때

Post

서버에 새로운 데이터를 추가할 때
그냥 데이터만 전달해서 결과를 도출할 때에도 사용

  • 회원가입 시 사용자가 입력 데이터를 서버에 전달
  • 로그인에 입력한 계정 정보를 전달할 때

Put

서버에 저장된 데이터를 업데이트

  • 프로필 정보 수정
  • 등록된 글 수정

Patch

Put과 비슷

  • Put은 전체 데이터 업데이트
  • ex) 완전히 새로운 프로필로 교체
    Patch
  • 일부 데이터 업데이트
  • ex) 이메일만 수정
    사실 두가지 경우 모두 put을 주로 사용

Delete

삭제할 때

  • 게시물이나 댓글을 삭제

Head, Connect, Options, Trace

자주 사용하지 않음

HTTP Params

아이디, 비밀번호와 같은 중요한 보안 정보는 Params로 전달해서는 안된다.
이 때는 Body에 담아서 전달해야 한다.

HTTP Body

참고로 Get 메소드에서는 Body를 사용하지 않는다.

  • Get 요청은 Browser History에 저장된다.
  • 다른 로그 시스템이 자동으로 기록하는 경우도 있다.
  • 따라서 개인정보가 유출되는 경우도 있다.
  • 그렇기때문에 서버에서 Get요청의 Body를 무시하는 경우가 상당하다.

Post 요청


API 연동

Get이 아닐 경우 URLRequest 사용

  • 메소드를 지정해야 하기 때문

http body 구조체 생성

http body 인코딩

jsonDecode 구조체 생성

urlsession 코드 작성

func sendLoginRequest(id: String, password: String){
        guard let url = URL(string: "https://kxapi.azurewebsites.net/login?apiKey=") else {
            return
        }
        
        let body = LoginPostBody(id: id, password: password)
        
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.httpBody = try? JSONEncoder().encode(body)
        
        let session = URLSession.shared
        
        let task = session.dataTask(with: request) { data, response, error in
            if let error{
                print(error)
                return
            }
            guard let httpResponse = response as? HTTPURLResponse else{
                self.showAlert(message: "잘못된 응답")
                return
            }
            guard httpResponse.statusCode == 200 else{
                self.showAlert(message: "요청 실패 - \(httpResponse.statusCode)")
                return
            }
            
            guard let data else{
                self.showAlert(message: "데이터 없음")
                return
            }
            
            do{
                let decoder = JSONDecoder()
                let response = try decoder.decode(LoginResponse.self, from: data)
                
                if response.code == 200{
                    //로그인 성공
                    DispatchQueue.main.async{
                        self.resultLabel.text = "로그인 성공"
                    }
                } else {
                    DispatchQueue.main.async{
                        self.resultLabel.text = response.message
                    }
                    
                    self.showAlert(message: response.message ?? "로그인 실패")
                }
            }catch{
                self.showAlert(message: error.localizedDescription)
            }
        }
        task.resume()
    }

Content-Type

  • json 데이터를 body에 저장했다고 해서 서버에서 자동으로 인식하는 것이 아님.
  • 반드시 Header에 Content-Type을 추가해야 함. 또한 어떤 포맷으로 보내는지 알려주어야 함.

MIME Type

json의 Content-Type은 application/json" 인데, 이것도 표준으로 정해져 있는 이름이다.
이런 이름을 MIME Type(Multipurpose Internet Mail Extensions) 라고 한다.

  • 데이터의 타입을 표현하는 타입

구조

type/subtype
  • text/html : html의 mime type

이외에 오디오나 이미지 등도 MIME Type 존재

  • image/png : Image Type의 png의 타입

우리가 api를 통해서 데이터를 주고받을 때는 application type 사용
보통은 요청과 응답 모두 같은 타입을 사용하지만, 아닌 경우도 있다.


profile
곰을 좋아합니다. <a href = "https://github.com/RudinP">github</a>

1개의 댓글

comment-user-thumbnail
2024년 3월 21일

안녕하세여 여쭤볼게있는데 ㅠㅠ010-3948-9826 이나 카톡 thegood12 연락한통주시면 감사해요 ㅠㅠ죄송합니당

답글 달기