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();
}
}
}