통신

냐옹·2024년 7월 11일
0

IOS

목록 보기
10/32

본 작성글은 swift 공식 문서를 참고하였습니다.

REST API에 대한 GET/POST요청

  • url을 아예 URLComponent라는 객체를 찍어내서 안의 속성을 수정하는 방법도 있고... (이건 뭔가 C# 스럽다)
  • 클래스형 개발에서 함수형 개발로 넘어가는 과정에 있는 듯한 느낌..
  • 다음은 GET요청 예시코드이다.
func performGetRequest(urlString : string) async throws -> Data{
// 함수선언에 throw키워드를 사용하면 해당 함수가 오류를 던질 수 있음을 나타낸다. 
// throws 함수를 호출할때는 try 키워드를 사용해야한다. 호출자에게 오류처리의 책임을 부여한다.
	guard let url = URL(string : urlString) else{
    	// 만약에 URL() 의 결과가 nil이라면
      	throw URLError(.badURL)
      	// 예외를 던진다.
    }
  
  	let (data, response) = try await URLSession.shared.data(from : url)
  
  	guard let httpResponse = response as? HTTPURLResponse,
      	// 2개 검사
      	(200...299).contains(httpResponse.statusCode) else{
		// 만약에 조건을 하나라도 못맞추면
    	throw URLError(.badServerResponse)
	}

	return data
}

Task{
	do{
    	let data = try await performGetRequest(urlString : "https// api.....com")
      	let user = try JSONDecoder().decode(디코딩할 타입, json이 저장되어있는 데이터)
      	print("data : \(user)")
    }catch{
    	print("error : \(error)")
      	// 암시적 바인딩
    }
}
  • 참고로 json이 저장되어있는 데이터의 생성은
let jsonString = """
{
	"id":"sewon",
    "age":"22",
      	.
    	.
    	.
}
"""

// 런타임 널참조 에러가 일어날 가능성이 있는 코드
let jsonData = jsonString.data(using : .utf8)!과 같이 할 수 있기는 한데 이 경우에 jsonString이 nil이면 위험하다.


// guard let으로 에러가 일어날 가능성을 줄인 코드
guard let jsonData = jsonString.data(using: .utf8) else{
	throw 에러
}
를 해서 jsonData를 쓰는 것이 안전하다. 
  • post 요청 예시
func performPOSTRequest(urlString : String, body: [String:Any]) async throws -> Data{
	// throws : 이 함수를 호출할 때는 오류처리에 대한 명시를 꼭 해야한다.
  	// body : key는 String 값은 아무값이나 가능
 	// async : 비동기
  	guard let url = URL(string : urlString) else{
    	throw URLError(.badUrl)
    }
  
  	var request = URLRequest(url : url)
    request.httpMethod = "POST"
  	request.addValue("application/json", forHTTPHeaderField: "Content-Type")
  
  	let jsonData = try JSONSerialization.data(withJSONObject : body
  
}
  • as? : 타입캐스팅 연산자
    as?는 swift의 조건부 다운캐스팅 연산자이다.
    한 타입의 인스턴스를 다른 타입의 인스턴스로 취급하려고 할때 사용되고,
    캐스팅이 성공하면 옵셔널 형태로 캐스팅된 값을 반환한다.
    캐스팅이 실패하면 nil을 반환한다.

  • contains 컬렉션 메서드
    contains는 swift의 시퀀스컬렉션에서 사용되는 메서드이다.
    특정요소가 컬렉션에 포함되어있는지 확인한다.
    주어진 조건을 만족하는 요소가 하나라도 있으면 true, 그렇지 않으면 false반환

  • (200...299)는 200부터 299까지의 범위를 나타내는 Range<Int>타입이다.

  • throws 를 함수선언에 넣음으로써 오류처리를 강제 했기 때문에 호출하는 코드에서는 다음의 형태가 된다. try를 의무적으로 사용해서 오류처리를 꼭 해주어야한다.

do {
    let data = try await performGetRequest(urlString: "https://api.example.com/data")
    // 데이터 처리
} catch {
    // 오류 처리
    print("Error occurred: \(error)")
}

0개의 댓글