Interact with table data in a ServiceNow instance
Summarize
Summary of Interact with table data in a ServiceNow instance
The Mobile SDK facilitates interactions with table data in your ServiceNow instance through the ServiceNow REST Table API. You can utilize theNowTableService()API for direct REST calls or theNowGraphQLService()API for executing GraphQL queries, particularly when retrieving data from multiple tables in a single call.
Show less
Key Features
- NowGraphQLService: Allows you to construct and execute GraphQL queries for CRUD operations on ServiceNow tables, requiring proper user authorization. It supports multiple execution styles, including async/await and completion handlers.
- NowTableService: Provides methods for performing CRUD operations on records in ServiceNow tables. It supports dot-walking for reference fields and applies Access Control Lists (ACLs) to ensure data security and integrity.
- Multiple result handling options for methods including async/await, completion handlers, and deprecated Combine publishers, giving flexibility in how data is managed and processed.
Key Outcomes
By leveraging these services, you can effectively manage your ServiceNow data—fetching, creating, and updating records in a secure and efficient manner. These capabilities enhance your ability to integrate and manipulate data, ultimately streamlining your workflows and improving operational efficiency.
The Mobile SDK enables you to interact with data in tables that reside on your ServiceNow instance. You can interact with this data through the ServiceNow REST Table API using the NowTableService() API that directly calls the REST interface, or through the NowGraphQLService() API that executes a specified GraphQL query against the REST GraphQL API.
If you want to return data from multiple tables within a single call, you will need to use the NowGraphQLService() API. If you need to interact with other ServiceNow REST APIs, see Interact with the public REST API on a ServiceNow instance.
Using NowGraphQLService to interact with ServiceNow tables
The NowGraphQLService class provides methods that enable you to construct and execute GraphQL queries on a specified table within your ServiceNow instance if the logged in user has the proper authorization. You can define all CRUD operations within your GraphQL query.
func execute(_ query: GraphQLQuery, completion: @escaping (Result<Data, NowDataError>) → Void)Through async/await:func execute(_ query: GraphQLQuery) async throws -> DataOr, a Combine publisher (which is currently deprecated): func publisher(for query: GraphQlQuery) → AnyPublisher<Data, NowDataError>
// 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
}
}
}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
}
}
}
}
}
"""Using NowTableService to interact with ServiceNow tables
The NowTableService class provides methods to perform CRUD operations on the records in tables that reside on your ServiceNow instance. Through this interface you can directly access any of the records within any ServiceNow table for which the logged in user is authorized. NowTableService supports dot-walking for reference fields. For example, if a table contains a reference to the User table, the
dot-walked value user.name returns the name of the user.
When returning the requested data, all applicable Access Control Lists (ACLs) are applied to the data, which may result in fewer results than expected, or authorization errors if the authenticated user does not have access rights to the specified table.
Most NowTableService methods provide three implementations for returning results data. One that uses async/await, one that calls a completion handler with a Result enumeration, and one that returns a Combine publisher, which is currently deprecated.
For example, all createRecord() methods insert a constructed record into a specified table, however, the
method calls a completion handler with a Result enumeration (the .success case contains the results as its associated
value).
The
NowTableService - createRecord(with fields: [FieldName: FieldValue], in tableName: String, writeOptions: FieldWriteOptions? = nil, configuration: FieldReadConfiguration? = nil) async throwsmethod performs an async/await function. While the
method returns a Combine publisher, but is currently deprecated.
In addition, NowTableService provides two different implementations of CRUD methods, one that returns raw data, and one that returns Codable models. For example, both the update() and updateRecord() methods update a specified record in a specified table, but the update() methods return a Codable model and the updateRecord() methods return raw data. In some cases, Codable methods might be preferable, as a strongly typed Codable structure provides more flexibility than a collection of raw data fields.
// 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)")
}
}For additional code examples using the available NowTableService methods, refer to the NowTableService class - iOS
API documentation.