Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

REST Client for ServiceNow's TableAPI for GET call in C#

Satish Babu
Mega Guru

 Hello there, 

Working with the Web Developer in integrating our ServiceNow platform with there WebApp.

As part of the development, we need a batch job that would query a list of records from the ServiceNow table and update curtains values in there WebApp.

But we unable to query the list of records using SNOW Table API for a specific date.

Can you someone help us with the C# code to get a list of records from a table for a specific date or a date range.

 

C# code the Web Developer has written.

var client = new RestClient(Instanceurl+ "/api/now/table/incident?sysparm_limit=15");

client.Authenticator = new HttpBasicAuthenticator(user, password);

var request = new RestRequest("incident", Method.GET);

request.AddParameter("sys_updated_on", "2020-02-18 19:23:22");

 

//Works but only when I pass the specific DateTime value.

request.RequestFormat = DataFormat.Json;

 

IRestResponse response = client.Execute(request);

dynamic _result = JsonConvert.DeserializeObject<RestAPIResult.ChildrenRootObject>(response.Content.ToString());

 

if (_result.result.Count > 0) //Important to prevent "Object reference not set to an instance of an object" error.

{

 

1 ACCEPTED SOLUTION

Simon Christens
Kilo Sage

Hi Satish

I have been like 15 years since i worked with C# but it should be possible to you duo to ServiceNow's input.

I would suggest that you use ServiceNows query builder to make you initial queries and then build them in your C# app

These are examples for different inputs for ServiceNow to filter in either periods or "today" as examples

query["sysparm_query"] = "sys_updated_onBETWEENjavascript:gs.dateGenerate('2020-03-01','00:00:00')@javascript:gs.dateGenerate('2020-05-17','00:00:00')";
query["sysparm_query"] = "sys_updated_on>=javascript:gs.beginningOfToday()";

find_real_file.png

And then:

find_real_file.png

Below is a C# sample that should return the correct incidents from a given period or date of these examples

 

using System;
using System.Net.Http;
using System.Text;
using System.Web;
using System.Collections.Generic;

namespace cs_test
{
    internal class Program
    {
        internal static void Main(string[] args)
        {
            byte[] byteArray = Encoding.ASCII.GetBytes("username:password");

            UriBuilder builder = new UriBuilder("https://instance.service-now.com/api/now/table/incident");

            var query = HttpUtility.ParseQueryString(builder.Query);
            query["sysparm_limit"] = "15";
            query["sysparm_fields"] = "number,short_description";
            query["sysparm_query"] = "sys_updated_onBETWEENjavascript:gs.dateGenerate('2020-03-01','00:00:00')@javascript:gs.dateGenerate('2020-05-17','00:00:00')";
            //query["sysparm_query"] = "sys_updated_on>=javascript:gs.beginningOfToday()";
            builder.Query = query.ToString();
            string url = builder.ToString();
            
            Console.WriteLine(url);

            GetRequst(url, byteArray);

            Console.ReadKey();
        }

        async static void GetRequst(string url, byte[] byteArray){

            using (HttpClient client = new HttpClient()){

                client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
                

                using (HttpResponseMessage response = await client.GetAsync(url)){

                    using(HttpContent content = response.Content){

                        string myContent = await content.ReadAsStringAsync();
                        var records = Newtonsoft.Json.JsonConvert.DeserializeObject<RootObject>(myContent);
   
                        Console.WriteLine(records.result.Count);

                        foreach(Record rec in records.result){

                            Console.WriteLine(rec.number + " - " + rec.short_description);
                        }        

                    }
                }
            }
        }
    }
    internal class RootObject{
        public List<Record> result { get; set; }
    }

    internal class Record{

        public string number { get; set; }
        public string short_description { get; set; }

    }
}

View solution in original post

8 REPLIES 8

Harsh Vardhan
Giga Patron

i think in C# you can pass the below line to get the date time and then pass it. 

 

DateTime now = DateTime.Now;

 

i think this way it should work. also add log to check the now value .

 

request.AddParameter("sys_updated_on", now);

Simon Christens
Kilo Sage

Hi Satish

I have been like 15 years since i worked with C# but it should be possible to you duo to ServiceNow's input.

I would suggest that you use ServiceNows query builder to make you initial queries and then build them in your C# app

These are examples for different inputs for ServiceNow to filter in either periods or "today" as examples

query["sysparm_query"] = "sys_updated_onBETWEENjavascript:gs.dateGenerate('2020-03-01','00:00:00')@javascript:gs.dateGenerate('2020-05-17','00:00:00')";
query["sysparm_query"] = "sys_updated_on>=javascript:gs.beginningOfToday()";

find_real_file.png

And then:

find_real_file.png

Below is a C# sample that should return the correct incidents from a given period or date of these examples

 

using System;
using System.Net.Http;
using System.Text;
using System.Web;
using System.Collections.Generic;

namespace cs_test
{
    internal class Program
    {
        internal static void Main(string[] args)
        {
            byte[] byteArray = Encoding.ASCII.GetBytes("username:password");

            UriBuilder builder = new UriBuilder("https://instance.service-now.com/api/now/table/incident");

            var query = HttpUtility.ParseQueryString(builder.Query);
            query["sysparm_limit"] = "15";
            query["sysparm_fields"] = "number,short_description";
            query["sysparm_query"] = "sys_updated_onBETWEENjavascript:gs.dateGenerate('2020-03-01','00:00:00')@javascript:gs.dateGenerate('2020-05-17','00:00:00')";
            //query["sysparm_query"] = "sys_updated_on>=javascript:gs.beginningOfToday()";
            builder.Query = query.ToString();
            string url = builder.ToString();
            
            Console.WriteLine(url);

            GetRequst(url, byteArray);

            Console.ReadKey();
        }

        async static void GetRequst(string url, byte[] byteArray){

            using (HttpClient client = new HttpClient()){

                client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
                

                using (HttpResponseMessage response = await client.GetAsync(url)){

                    using(HttpContent content = response.Content){

                        string myContent = await content.ReadAsStringAsync();
                        var records = Newtonsoft.Json.JsonConvert.DeserializeObject<RootObject>(myContent);
   
                        Console.WriteLine(records.result.Count);

                        foreach(Record rec in records.result){

                            Console.WriteLine(rec.number + " - " + rec.short_description);
                        }        

                    }
                }
            }
        }
    }
    internal class RootObject{
        public List<Record> result { get; set; }
    }

    internal class Record{

        public string number { get; set; }
        public string short_description { get; set; }

    }
}

Awesome!! worked like a champ.

Thanks, Simon

Sema A
Kilo Explorer

Simon, your solution worked. Thank you so much for sharing this information