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

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

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

    NowGraphQLService を使用して ServiceNow テーブルを操作する

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

    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 テーブルへの参照が含まれている場合、ドット連結値 user.name はユーザーの名前を返します。

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

    ほとんどの NowTableService メソッドは、結果データを返すための 3 つの実装を提供します。async/await を使用するもの、 Result 列挙型で補完ハンドラーを呼び出すもの、および現在非推奨の Combine パブリッシャーを返すもの。

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

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

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

    application

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

    メソッドは非同期/待機関数を実行します。一方、

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

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

    さらに、 NowTableService は、生データを返すものと Codable モデルを返すものの、2 つの異なる CRUD メソッドの実装を提供します。たとえば、 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 ドキュメントを参照してください。