네이버 SMS API 사용하기 (2/2)

Jehyeon Lee·2023년 11월 23일
0

네이버 SMS API

목록 보기
2/3

통신에 필요한 데이터를 인스턴스화 하기

api와 통신을 하기 위해선 헤더부분과 사용자에게 갈 문자메시지 내용 바디부분을 만들어야합니다. 그전까지 만들어놨던 메서드를 사용하여 요청에 필요한 정보들을 가공할겁니다.

func sendVerificationCode(number: String) {
        
        let urlString = "https://sens.apigw.ntruss.com/sms/v2/services/\(serviceId)/messages"
        let signature = makeSignature()
        
        let randomCode = configRandomCode()
        let message = """
            PICO 인증번호: \(randomCode)
            """
        let number = number.replacingOccurrences(of: "-", with: "")

        let smsRequest = SMSRequest(type: SMSRequestType.sms.name,
                                    from: senderPhoneNumber,
                                    subject: "PICO 인증번호 발송",
                                    content: message,
                                    messages: [Message(to: number)],
                                    files: [])
        let bodyDict = smsRequest.asDictionary()
        
        ...
    }

코드 설명

  • urlString은 변수명 그대로이다.
  • signature은 SHA265알고리즘을 통해 만든 header부분이다.
  • randomCode, Message 등 사용자에게 보여질 정보이다.
  • Number는 앱내에서 자체적으로 정규화를 통해 3-4-4 자리로만 번호가 입력되도록 하였다. 그리고 지금 과정에선 "-" 을 공백으로 돌린다.
  • smsRequest는 전편에서 만든 JSON으로 넘길 구조체의 인스턴스를 하나 만들어 저장하였다.
  • 위 코드에서 let bodyDict은 smsRequest를 딕셔너리 형태로 타입변경을 하였다.

통신을 위한 설정

api를 사용하기 위해서는 서버와 통신을 해야합니다.
여태까지 서버와 통신하기 위한 JSON
바디 부분과 api가 요구하는 헤더부분을 만들었습니다.
이제부터 그것들을 가지고 URLSession 사용하여 API와 통신을 할것입니다.

var request = URLRequest(url: URL(string: urlString)!)
        request.httpMethod = method
        request.setValue("application/json", forHTTPHeaderField: "accept")
        request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
        request.setValue(accessKey, forHTTPHeaderField: "x-ncp-iam-access-key")
        request.setValue(timestamp, forHTTPHeaderField: "x-ncp-apigw-timestamp")
        request.setValue(signature, forHTTPHeaderField: "x-ncp-apigw-signature-v2")
        request.httpBody = try? JSONSerialization.data(withJSONObject: bodyDict, options: [.prettyPrinted])
        
        

코드 설명

  • URLRequest 인스턴스 안에 통신을 할 api 주소를 넣었습니다.
  • httpMethod 는 위에 설정한 method "Post" 방식으로 설정하였습니다.
  • setValue를 사용하여 api에 필요한 헤더를 설정하였습니다.
    - 콘텐츠 유형, access유형 및 accesskey, 타임스탬프와 서명같은것들을 설정한겁니다.
  • "request.httpBody = try? JSONSerialization.data(withJSONObject: bodyDict, options: [.prettyPrinted]) " 이 부분은 HTTP의 Body를 설정합니다. JSON으로 인코딩을 하고 요청의 본문으로 설정하는 코드입니다.

URLSession

이제 요청을 보낸 데이터의 응답을 받아와야 합니다.
서버와 통신하기 위해서는 비동기적으로 서버와 작업을 해야합니다.
그러므로 URLSession을 사용할것입니다.

let task = URLSession.shared.dataTask(with: request) { data, response, error in
            if let error = error {
                print("Error: \(error)")
                return
            }
            
            guard let data = data else {
                print("No data received")
                return
            }
            
            guard let httpResponse = response as? HTTPURLResponse else {
                print("Invalid HTTP response")
                return
            }
            
            let statusCode = httpResponse.statusCode
            print("Status Code: \(statusCode)")
            
            if let responseString = String(data: data, encoding: .utf8) {
                print("Response: \(responseString)")
            }
        }
        task.resume()

코드 설명

  • URLSession.shared.dataTask(with: request)를 호출하여 데이터 작업을 생성했고, 이 메서드는 주어진 URL 요청을 기반으로 비동기적인 데이터 작업을 생성합니다.
  • URLSession에서 data은 서버에서 수신한 데이터입니다.
  • response는 HTTP 응답에 대한 메타데이터입니다.
  • error는 데이터 작업 중에 발생한 오류입니다.
  • guard let으로 error와 data, Response에 대한 에러처리를 해두었습니다.
  • resume으로 작업이 중단되거나 시작되지 않았더라면 작업을 다시 시작합니다.

이렇게 api 와 통신하는 코드를 작성하였고, 성공적이게 문자인증을 하는 기능을 구현하였습니다.

성공화면

profile
공부한거 느낌대로 써내려갑니당

0개의 댓글

관련 채용 정보