Code Demo: Client App Written in c#

using System.Net.Http.Headers;
using System.Text.Json;
using System.Text;

namespace TreeTraceSrvClientDemo
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string serviceBaseAddress = "https://treetracesrv-dev.sylvamo.com";

            Console.Write("Enter username: ");
            string userName = Console.ReadLine() ?? string.Empty;

            Console.Write("Enter password: ");
            string password = Console.ReadLine() ?? string.Empty;

            string token = "";
            Console.WriteLine("Getting token for user: " + userName);
            try
            {
                token = GetToken(userName, password, $"{serviceBaseAddress}/Auth/token");
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error getting token: " + ex.Message);
                return;
            }

            Console.WriteLine("Token received:");
            Console.WriteLine($"\t{token}");
            Console.WriteLine("Now you can use this token to retrieve tree trace data sets by querying by load, invoice and/or Customer PO numbers. To quit this demo just enter both numbers empty.\n");

            while (true)
            {
                Console.Write("Enter load number (or press Enter to skip): ");
                string loadNumber = Console.ReadLine() ?? string.Empty;

                Console.Write("Enter invoice number (or press Enter to skip): ");
                string invoiceNumber = Console.ReadLine() ?? string.Empty;

                Console.Write("Enter Customer PO number (or press Enter to skip): ");
                string customerPO = Console.ReadLine() ?? string.Empty;

                if (string.IsNullOrEmpty(loadNumber) && string.IsNullOrEmpty(invoiceNumber) && string.IsNullOrEmpty(customerPO))
                {
                    Console.WriteLine("Exiting program.");
                    break;
                }

                Console.WriteLine("Getting tree trace data...");
                try
                {
                    var treeTraceData = GetTreeTraceData(loadNumber, invoiceNumber, customerPO, token, $"{serviceBaseAddress}/Eudr/GetRecords");
                    Console.WriteLine("Tree trace data received: " + treeTraceData);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error getting tree trace data: " + ex.Message);
                }

                Console.Write("Do you want to retrieve GeoJson data? ");
                string fetchGeoJson = Console.ReadLine() ?? string.Empty;
                if (fetchGeoJson?.ToLower() == "y" || fetchGeoJson?.ToLower() == "yes")
                {
                    Console.WriteLine("Getting GeoJson data...");
                    try
                    {
                        var geoJsonData = GetTreeTraceData(loadNumber, invoiceNumber, customerPO, token, $"{serviceBaseAddress}/Eudr/GetGeoJson");
                        Console.WriteLine("GeoJson data received: " + geoJsonData);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("Error getting GeoJson data: " + ex.Message);
                    }
                }

                Console.WriteLine("-------------------------\r\n");
            }
        }

        public static string GetToken(string userName, string password, string tokenEndpointUri)
        {
            using var client = new HttpClient();
            var credentials = $"{userName}:{password}";
            var base64Credentials = Convert.ToBase64String(Encoding.UTF8.GetBytes(credentials));

            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*"));
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", base64Credentials);

            var content = new StringContent(string.Empty, Encoding.UTF8, "application/json");

            var response = client.PostAsync(tokenEndpointUri, content).GetAwaiter().GetResult();

            if (!response.IsSuccessStatusCode)
            {
                var errorMessage = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
                throw new HttpRequestException($"Server returned error: {response.StatusCode}. Message: {errorMessage}");
            }

            var responseString = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();

            using var doc = JsonDocument.Parse(responseString);
            if (doc.RootElement.TryGetProperty("token", out var tokenElement))
            {
                return tokenElement.GetString() ?? string.Empty;
            }

            throw new InvalidOperationException("Token not found in response.");
        }

        public static string GetTreeTraceData(string? loadNumber, string? invoiceNumber, string? customerPo, string token, string dataEndpointUri)
        {
            using var client = new HttpClient();

            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*"));
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

            var requestBody = new
            {
                invoiceNumber = invoiceNumber,
                loadNumber = loadNumber,
                customerPo = customerPo
            };

            var json = JsonSerializer.Serialize(requestBody);
            
            
            var content = new StringContent(json, Encoding.UTF8, "application/json");

            var response = client.PostAsync(dataEndpointUri, content).GetAwaiter().GetResult();

            if (!response.IsSuccessStatusCode)
            {
                var errorMessage = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
                throw new HttpRequestException($"Server returned error: {response.StatusCode}. Message: {errorMessage}");
            }

            return response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
        }
    }
}
An unhandled exception has occurred. See browser dev tools for details. Reload 🗙