NowAPIService 클래스 - iOS

  • 릴리스 버전: Xanadu
  • 업데이트 날짜 2024년 08월 01일
  • 읽기12분
  • NowAPIService 클래스는 지정된 ServiceNow REST API에 대한 요청을 수행할 수 있는 함수를 제공합니다.

    표 1. 속성
    이름 유형 설명
    구성 NowServiceConfiguration 프로토콜과 연결할 서비스 구성입니다.

    NowAPIService - 데이터(엔드포인트의 경우: NowAPIEndpoint, queryItems: [문자열: 문자열], httpHeaders: [문자열: 문자열], 본문: 데이터, 완성: @escaping(결과<DataResponse, NowDataError>)

    지정된 ServiceNow REST API에서 데이터를 요청한 다음 완료 핸들러를 실행합니다.

    표 2. 매개변수
    이름 유형 설명
    엔드포인트용 NowAPIEndpoint HTTP 메서드, 엔드포인트에 ServiceNow 대한 상대 경로, 경로 매개변수, 인증 필요 여부 등 액세스할 REST API 엔드포인트가 포함된 객체입니다.
    queryItems (쿼리 항목) 배열 옵션입니다. 엔드포인트에 대한 쿼리 매개변수(키/값 쌍)입니다.

    기본값 : nil

    httpHeaders 배열 옵션입니다. 엔드포인트에 키/값 쌍으로 필요한 HTTP 헤더를 요청합니다.

    기본값 : nil

    본문 문자열 옵션입니다. 요청 본문 매개변수입니다.

    기본값 : nil

    완료 @escaping(Result<DataResponse, NowDataError>) REST API 호출이 완료된 후 실행할 완료 핸들러입니다.
    완료 처리기에 대한 반환 값:
    • 성공: REST API 호출에서 반환된 데이터를 포함하는 DataResponse입니다.
    • 실패: NowDataError
      • accessToken(AccessTokenProviderError)
        • AccessTokenProviderError: 액세스 토큰 공급자의 오류 코드 또는 메시지입니다.
          • accessTokenRetrievalFailed
          • userSessionError(_ 오류: 오류)

        액세스 토큰에 오류가 있을 때 throw됩니다.

      • 첨부 파일 유효성 확인

        첨부 파일 확인에 실패할 때 발생합니다.

      • badResponse (상태 코드 : HTTPStatusCode)
        • HTTPStatusCode: 인스턴스에서 받은 상태 코드입니다.

        요청이 예기치 않은 응답을 반환할 때 발생합니다.

      • cannotDecodeModel (디코딩 오류)
        • DecodingError: 디코딩 오류가 감지되었습니다.

        코딩 가능한 모델을 JSON에서 디코딩할 수 없을 때 발생합니다.

      • cannotDecodeProperty(type: Any, from: String)
        • type: 문자열에서 디코딩할 래핑된 유형입니다.
        • from: 지정된 타입으로 디코딩할 문자열.

        문자열로 래핑된 값을 JSON에서 디코딩할 수 없을 때 발생합니다.

      • cannotEncodeModel (인코딩 오류)
        • EncodingError: 인코딩 오류가 탐지되었습니다.

        코딩 가능 모델을 JSON으로 인코딩할 수 없는 경우 발생합니다.

      • cannotParseResponse (파스 응답)

        인스턴스의 응답을 예상 형식으로 구문 분석할 수 없을 때 발생합니다.

      • 잘못된 URL

        URL을 구성할 수 없을 때 발생합니다. 예를 들어 문자열에 URL에 잘못된 문자가 포함되어 있거나 빈 문자열인 경우입니다.

      • missingAttachmentMetadata 님

        첨부 파일 메타데이터 헤더가 없을 때 발생합니다.

      • missingServiceConfiguration

        예상 서비스 구성이 없을 때 throw됩니다.

      • missingSysID

        예상 sys_id 매개 변수가 없을 때 발생합니다.

      • 네트워크(NetworkServiceError)
        • genericError (문자열)
        • operationCanceled (운영이 취소됨)
        • serviceDisabled (영문)
        • serverError(오류)
        • systemError(오류)

        네트워크 서비스에 오류가 발생했을 때 throw됩니다.

    표 3. 반환
    유형 설명
    없음

    다음 코드 예제에서는 이 함수를 호출하는 방법을 보여 줍니다.

    struct Endpoint: NowAPIEndpoint {
      let httpMethod: HTTPMethod
      let relativePath: String
      let requiresAuthentication: Bool
    }
    
    /// HTTP request method
    public enum HTTPMethod: CaseIterable {
        case options, get, head, post, put, patch, delete, trace, connect
    }
    let relativePath = “/api/now/account”
    let endPoint = Endpoint(httpMethod: HTTPMethod.get, relativePath: relativePath, requiresAuthentication: true)
    
    apiService.data(for: endPoint, queryItems: [“name”: “abel”], httpHeaders: httpHeaders, body: body.data(using: .utf8)) { [weak self] (result) in
      switch result {
        case .success(let response):
        // Data request successful
        case .failure(let error):
        // Data request failed, return NowDataError
        // .failure(error)
      }
    }
    

    NowAPIService - data(엔드포인트의 경우: NowAPIEndpoint, queryItems: [String: String], httpHeaders: [String: String], body: Data) 비동기 던지기

    지정된 ServiceNow REST API에서 데이터를 요청합니다.

    표 4. 매개변수
    이름 유형 설명
    엔드포인트용 NowAPIEndpoint 액세스 권한이 포함된REST API 엔드포인트(HTTP 메서드, 엔드포인트에 ServiceNow 대한 상대 경로, 경로 매개변수 및 인증 필요 여부 등)를 포함하는 객체입니다.
    queryItems (쿼리 항목) 배열 옵션입니다. 엔드포인트에 대한 쿼리 매개변수 (키/값 쌍)입니다.

    기본값 : nil

    httpHeaders 배열 옵션입니다. 엔드포인트에 키/값 쌍으로 필요한 HTTP 헤더를 요청합니다.

    기본값 : nil

    본문 문자열 옵션입니다. Request body parameters.

    기본값 : nil

    표 5. 반환
    유형 설명
    데이터 응답 메서드가 성공하면 반환됩니다. REST API 호출의 데이터입니다.
    NowDataError 메서드가 실패할 때 throw됩니다.
    • accessToken(AccessTokenProviderError)
      • AccessTokenProviderError: 액세스 토큰 공급자의 오류 코드 또는 메시지입니다.
        • accessTokenRetrievalFailed
        • userSessionError(_ 오류: 오류)

      액세스 토큰에 오류가 있을 때 throw됩니다.

    • 첨부 파일 유효성 확인

      첨부 파일 확인에 실패할 때 발생합니다.

    • badResponse (상태 코드 : HTTPStatusCode)
      • HTTPStatusCode: 인스턴스에서 받은 상태 코드입니다.

      요청이 예기치 않은 응답을 반환할 때 발생합니다.

    • cannotDecodeModel (디코딩 오류)
      • DecodingError: 디코딩 오류가 감지되었습니다.

      코딩 가능한 모델을 JSON에서 디코딩할 수 없을 때 발생합니다.

    • cannotDecodeProperty(type: Any, from: String)
      • type: 문자열에서 디코딩할 래핑된 유형입니다.
      • from: 지정된 타입으로 디코딩할 문자열.

      문자열로 래핑된 값을 JSON에서 디코딩할 수 없을 때 발생합니다.

    • cannotEncodeModel (인코딩 오류)
      • EncodingError: 인코딩 오류가 탐지되었습니다.

      코딩 가능 모델을 JSON으로 인코딩할 수 없는 경우 발생합니다.

    • cannotParseResponse (파스 응답)

      인스턴스의 응답을 예상 형식으로 구문 분석할 수 없을 때 발생합니다.

    • 잘못된 URL

      URL을 구성할 수 없을 때 발생합니다. 예를 들어 문자열에 URL에 잘못된 문자가 포함되어 있거나 빈 문자열인 경우입니다.

    • missingAttachmentMetadata 님

      첨부 파일 메타데이터 헤더가 없을 때 발생합니다.

    • missingServiceConfiguration

      예상 서비스 구성이 없을 때 throw됩니다.

    • missingSysID

      예상 sys_id 매개 변수가 없을 때 발생합니다.

    • 네트워크(NetworkServiceError)
      • genericError (문자열)
      • operationCanceled (운영이 취소됨)
      • serviceDisabled (영문)
      • serverError(오류)
      • systemError(오류)

      네트워크 서비스에 오류가 발생했을 때 throw됩니다.

    다음 코드 예제에서는 이 메서드를 호출하는 방법을 보여 줍니다.

    do {
        let dataResponse = try await apiService.data(for: endpoint, queryItems: queryItems, httpHeaders: httpHeaders, body: body)
        // Data request successful
    } catch {
        // Data request failed, NowDataError thrown
    }

    NowAPIService - 데이터(엔드포인트의 경우: NowAPIEndpoint, queryItems: [String: String]? = nil, httpHeaders: [string: String]? = nil, body: Data? = nil)

    지정된 ServiceNow REST API에서 데이터를 요청합니다.

    주:
    이 메서드는 더 이상 사용되지 않습니다. 대신 메서드의 async/await 구현을 사용해야 합니다.
    표 6. 매개변수
    이름 유형 설명
    엔드포인트용 NowAPIEndpoint HTTP 메서드, 엔드포인트에 ServiceNow 대한 상대 경로, 경로 매개변수, 인증 필요 여부 등 액세스할 REST API 엔드포인트가 포함된 객체입니다.
    queryItems (쿼리 항목) 배열 옵션입니다. 엔드포인트에 대한 쿼리 매개변수(키/값 쌍)입니다.

    기본값 : nil

    httpHeaders 배열 옵션입니다. 엔드포인트에 키/값 쌍으로 필요한 HTTP 헤더를 요청합니다.

    기본값 : nil

    본문 데이터 옵션입니다. 요청 본문 매개변수입니다.

    기본값 : nil

    표 7. 반환
    유형 설명
    AnyPublisher<DataResponse, NowDataError> 성공: REST API에서 반환한 데이터입니다.

    실패: NowDataError

    • accessToken(AccessTokenProviderError)
      • AccessTokenProviderError: 액세스 토큰 공급자의 오류 코드 또는 메시지입니다.
        • accessTokenRetrievalFailed
        • userSessionError(_ 오류: 오류)

      액세스 토큰에 오류가 있을 때 throw됩니다.

    • 첨부 파일 유효성 확인

      첨부 파일 확인에 실패할 때 발생합니다.

    • badResponse (상태 코드 : HTTPStatusCode)
      • HTTPStatusCode: 인스턴스에서 받은 상태 코드입니다.

      요청이 예기치 않은 응답을 반환할 때 발생합니다.

    • cannotDecodeModel (디코딩 오류)
      • DecodingError: 디코딩 오류가 감지되었습니다.

      코딩 가능한 모델을 JSON에서 디코딩할 수 없을 때 발생합니다.

    • cannotDecodeProperty(type: Any, from: String)
      • type: 문자열에서 디코딩할 래핑된 유형입니다.
      • from: 지정된 타입으로 디코딩할 문자열.

      문자열로 래핑된 값을 JSON에서 디코딩할 수 없을 때 발생합니다.

    • cannotEncodeModel (인코딩 오류)
      • EncodingError: 인코딩 오류가 탐지되었습니다.

      코딩 가능 모델을 JSON으로 인코딩할 수 없는 경우 발생합니다.

    • cannotParseResponse (파스 응답)

      인스턴스의 응답을 예상 형식으로 구문 분석할 수 없을 때 발생합니다.

    • 잘못된 URL

      URL을 구성할 수 없을 때 발생합니다. 예를 들어 문자열에 URL에 잘못된 문자가 포함되어 있거나 빈 문자열인 경우입니다.

    • missingAttachmentMetadata 님

      첨부 파일 메타데이터 헤더가 없을 때 발생합니다.

    • missingServiceConfiguration

      예상 서비스 구성이 없을 때 throw됩니다.

    • missingSysID

      예상 sys_id 매개 변수가 없을 때 발생합니다.

    • 네트워크(NetworkServiceError)
      • genericError (문자열)
      • operationCanceled (운영이 취소됨)
      • serviceDisabled (영문)
      • serverError(오류)
      • systemError(오류)

      네트워크 서비스에 오류가 발생했을 때 throw됩니다.

    다음 코드 예제에서는 이 함수를 호출하는 방법을 보여 줍니다.

    struct Endpoint: NowAPIEndpoint {
        let httpMethod: HTTPMethod
        let relativePath: String
        let requiresAuthentication: Bool
    }
    
    /// HTTP request method
    public enum HTTPMethod: CaseIterable {
        case options, get, head, post, put, patch, delete, trace, connect
    }
    let relativePath = "/api/now/account"
    let endPoint = Endpoint(httpMethod: HTTPMethod.get, relativePath: relativePath, requiresAuthentication: true)
    
    // Using Combine
    apiService.data(for: Endpoint(httpMethod: httpMethod, relativePath: endpointPath, requiresAuthentication: requiresAuthentication), queryItems: queryItems, httpHeaders: httpHeaders, body: body.data(using: .utf8))
      .receive(on: DispatchQueue.main)
      .sink { [weak self] (comp) in
        if case let .failure(error) = comp {
          // Data request failed, return NowDataError
        }
      } receiveValue: { [weak self] (response) in
        // Data request successful
        self?.publish(data: response.data)
      }
      .store(in: &self.subscriptions)
    }