ServiceNowインスタンス内のテーブルデータの操作

  • リリースバージョン: Xanadu
  • 更新日 2024年08月01日
  • 所要時間:8分
  • Mobile SDKを使用すると、ServiceNowインスタンスに存在するテーブル内のデータを操作できます。このデータは、REST インターフェイスを直接呼び出す NowTableService() API を使用する ServiceNow REST Table API を介して、または REST GraphQL API に対して指定された GraphQL クエリを実行する NowGraphQLService() API を介して操作できます。

    1回の呼び出しで複数のテーブルからデータを返す場合は、 NowGraphQLService() APIを使用する必要があります。他の ServiceNow REST API とやり取りする必要がある場合は、「 ServiceNowインスタンスでのパブリック REST API とのやり取り」を参照してください。

    NowGraphQLService を使用した ServiceNow テーブルとのやり取り

    NowGraphQLService クラスは、ログインしているユーザーが適切な権限を持っている場合に、ServiceNow インスタンス内の指定されたテーブルで GraphQL クエリを構築して実行できるメソッドを提供します。すべての CRUD 操作を GraphQL クエリ内で定義できます。

    NowGraphQLService は、完了ハンドラーを返すことで、クエリの結果のフェッチをサポートします。
    func execute(_ query: GraphQLQuery, completion: @escaping (Result<Data, NowDataError>) → Void)
    async / await経由:
    func execute(_ query: GraphQLQuery) async throws -> Data
    または、 Combine パブリッシャー (現在は非推奨) :
    func publisher(for query: GraphQlQuery) → AnyPublisher<Data, NowDataError>
    
    次の例は、NowData フレームワークをインポートし、 ServiceNow インスタンス内のテーブルとのやり取りに使用できる NowGraphQLService オブジェクトを初期化する方法を示しています。
    // Import the NowData framework
    import NowData
    
    // Initialize a NowGraphQLService
    // The makeGraphQLService completion handler returns a result that wraps 
    // the NowGraphQLService upon success or error. 
    
    private func initializeGraphQLService(instanceUrl: URL) {
      makeGraphQLService(instanceUrl: instanceUrl) { [weak self] result in
        switch result {
        case .success(let service):
          self?.graphQLService = service
        case .failure(let error):
          debugPrint("Creating GraphQL service failed with error: \(error.localizedDescription)")
          self?.graphQLService = nil
        }
      }
    }
    この例では、最近公開された KB 記事をフェッチして公開する非同期関数を作成する方法を示します。
    private func fetchArticles() async throws -> [Article] { 
        guard let graphQLService = graphQLService else { 
            throw ArticleListError.invalidGraphQLService 
        }         
    
        do {
            let data = try await graphQLService.execute(GraphQLQuery(query: recentlyPublishedQuery))
            let articles = try dataToArticleList(data)
        } catch let error as NowDataError {
            throw ArticleListError.fetchError(error)
        } catch {
            throw error
        }
    } 
      
    private let recentlyPublishedQuery = 
    """ 
    
    {
      GlideRecord_Query {
        kb_knowledge(queryConditions: "active=true^ORDERBYpublishedDESC" pagination: { limit: 10, offset: 0 }) {
          _results { 
            sys_id {
              value
            },
            number {
              displayValue
            },
            short_description {
              displayValue
            },
            author {
              displayValue
            }
            published {
              displayValue
            }
          }
        }
      }
    }
    """

    NowTableService を使用した ServiceNow テーブルとの対話

    NowTableService クラスは、ServiceNowインスタンスに存在するテーブル内のレコードに対して CRUD 操作を実行するためのメソッドを提供します。このインターフェイスから、ログインしているユーザーが許可されている ServiceNow テーブル内の任意のレコードに直接アクセスできます。NowTableService は、 参照フィールドのドット連結をサポートしています。たとえば、テーブルにユーザーテーブルへの参照が含まれている場合、ドット連結値 user.name はユーザーの名前を返します。

    要求されたデータを返すと、該当するすべてのアクセス制御リスト (ACL) がデータに適用されるため、結果が予想よりも少なくなるか、認証されたユーザーが指定されたテーブルへのアクセス権を持っていない場合は認証エラーが発生する可能性があります。

    ほとんどの NowTableService メソッドには、結果データを返すための 3 つの実装が用意されています。1 つは async/await を使用し、もう 1 つは Result 列挙を使用して完了ハンドラーを呼び出し、もう 1 つは現在非推奨の Combine パブリッシャーを返します。

    たとえば、すべての createRecord() メソッドは、構築されたレコードを指定されたテーブルに挿入しますが、

    NowTableService - createRecord(with fields: [FieldName: FieldValue], in tableName: String, writeOptions: FieldWriteOptions, configuration: FieldReadConfiguration, completion: @escaping (Result<Data, NowDataError>)

    メソッドは、 Result 列挙型を使用して完了ハンドラーを呼び出します ( .success ケースには、関連付けられた値として結果が含まれます)。

    -

    NowTableService - createRecord(with fields: [FieldName: FieldValue], in tableName: String, writeOptions: FieldWriteOptions? = nil, configuration: FieldReadConfiguration? = nil) 非同期スロー

    メソッドは async/await 関数を実行します。一方、

    NowTableService - createRecord(with fields: [FieldName: FieldValue], in tableName: String, writeOptions: FieldWriteOptions? = nil, configuration: FieldReadConfiguration? = nil)

    メソッドは Combine パブリッシャーを返しますが、現在は非推奨です。

    さらに、 NowTableService には、生データを返すメソッドと Codable モデルを返す CRUD メソッドの 2 つの異なる実装が用意されています。たとえば、 update() メソッドと updateRecord() メソッドはどちらも指定されたテーブルの指定されたレコードを更新しますが、 update() メソッドは Codable モデルを返し、 updateRecord() メソッドは生データを返します。場合によっては、厳密に型指定された Codable 構造体は生データフィールドのコレクションよりも柔軟性が高いため、Codable メソッドが望ましい場合があります。

    次の例は、 NowData フレームワークをインポートし、 ServiceNow インスタンステーブルとのやり取りに使用できる NowTableService オブジェクトを初期化する方法を示しています。
    // Import the NowData framework
    import NowData
    
    // Initialize a NowTableService
    // The makeTableService completion handler returns a result that wraps 
    // the NowTableService upon success or error. 
    
    makeTableService(instanceUrl: instanceUrl) { [weak self] result in
      guard let self = self else { return }
      
      switch result {
      case .success(let tableService):
        debugPrint("Successfully created a table service \(tableService)")
        self.tableService = tableService
      case .failure(let error):
        debugPrint("Creating table service failed with error: \(error.localizedDescription)")
      }
    }

    使用可能な NowTableService メソッドを使用するその他のコード例については、 NowTableService クラス - iOS API ドキュメントを参照してください。