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 |