본문 바로가기

학습 노트/iOS (2021)

211. Post Request

Post Request


서버로 데이터를 전송하는 경우 보통 POST와 PUT을 사용하게 된다.
전송하는 데이터의 형식은 서버에 따라 달라 API 문서를 확인하는 과정이 필요하다.

POST를 위해 필요한 request 정보는 다음과 같다.

  • method
    POST
  • header
    Content-Type : application/json
  • body
  • url

 

JSON 데이터 구조

struct PostData: Codable {
   let a: Int
   let b: Int
   let op: String
}

서버는 JSON 파일을 받고, 세 개의 데이터를 받는다.
이들은 각각, 연산자와 피연사자로 사용된다.
따라서 JSON Encoding에 사용할 구조체도 이에 맞도록 구현해야 한다.

 

Request 생성

@IBAction func sendPostRequest(_ sender: Any) {
  guard let url = URL(string: testurl) else {
     fatalError("Invalid URL")
  }
}

마찬가지로 URL을 생성하는 것으로 시작한다.

@IBAction func sendPostRequest(_ sender: Any) {
  guard let url = URL(string: testurl) else {
     fatalError("Invalid URL")
  }
  
   var request = URLRequest(url: url)
}

서버에 데이터를 전달하는 형태이기 때문에 URLRequest 인스턴스를 생성한다.

@IBAction func sendPostRequest(_ sender: Any) {
  guard let url = URL(string: testurl) else {
     fatalError("Invalid URL")
  }
  
   var request = URLRequest(url: url)
   request.addValue("application/json", forHTTPHeaderField: "Content-Type")
}

서버는 JSON 파일을 받게 될 예정이고 이를 명시적으로 표현야 한다.
API의 'Content-Type' 에 'application/json'을 저장한다.

@IBAction func sendPostRequest(_ sender: Any) {
  guard let url = URL(string: testurl) else {
     fatalError("Invalid URL")
  }
  
   var request = URLRequest(url: url)
   request.addValue("application/json", forHTTPHeaderField: "Content-Type")
   request.httpMethod = "POST"
   request.httpBody = encodedData()
}

heepMethod와 httpBody에도 해당하는 값들을 저장한다.

 

Task 생성

@IBAction func sendPostRequest(_ sender: Any) {
  guard let url = URL(string: testurl) else {
     fatalError("Invalid URL")
  }
  
   var request = URLRequest(url: url)
   request.addValue("application/json", forHTTPHeaderField: "Content-Type")
   request.httpMethod = "POST"
   request.httpBody = encodedData()

   let task = URLSession.shared.dataTask(with: request) { data, response, error in
       if let error = error {
           self.showErrorAlert(with: error.localizedDescription)
           print(error)
       }

       guard let httpResponse = response as? HTTPURLResponse else {
           self.showErrorAlert(with: "Invalid Response")
           return
       }

       guard (200...299).contains(httpResponse.statusCode) else {
           self.showErrorAlert(with: "\(httpResponse.statusCode)")
           return
       }

       guard let data = data, let str = String(data: data, encoding: .utf8) else {
           fatalError("Invalid Data")
       }

       self.showInfoAlert(with: str)
   }
}

request를 사용해 Task를 생성하고,
반환 결과를 Completion Handler를 사용해 처리한다.

서버는 결과인 BinaryData를 문자열로 변환해 이것을 Alert로 표시한다.

@IBAction func sendPostRequest(_ sender: Any) {
  guard let url = URL(string: testurl) else {
     fatalError("Invalid URL")
  }
  
   var request = URLRequest(url: url)
   request.addValue("application/json", forHTTPHeaderField: "Content-Type")
   request.httpMethod = "POST"
   request.httpBody = encodedData()

   print(request)

   //Task 생성
   let task = URLSession.shared.dataTask(with: request) { data, response, error in
       if let error = error {
           self.showErrorAlert(with: error.localizedDescription)
           print(error)
       }

       guard let httpResponse = response as? HTTPURLResponse else {
           self.showErrorAlert(with: "Invalid Response")
           return
       }

       guard (200...299).contains(httpResponse.statusCode) else {
           self.showErrorAlert(with: "\(httpResponse.statusCode)")
           return
       }

       guard let data = data, let str = String(data: data, encoding: .utf8) else {
           fatalError("Invalid Data")
       }

       self.showInfoAlert(with: str)
   }

   task.resume()
}

최종적으로 완성된 Task는 바로 실행되지 않으므로,
resume 메서드를 호출해 직접 동작시켜야 한다.

 

결과


'학습 노트 > iOS (2021)' 카테고리의 다른 글

213. Download Task  (0) 2022.08.30
212. Upload Task  (0) 2022.08.26
210. SessionConfiguration  (0) 2022.08.23
209. URL Session Delegate  (0) 2022.08.23
208. Data Task  (0) 2022.08.22