public CongreeCheckresult Check(string text, string ruleSet) { text = text.Replace("\"", "'"); var client = new RestClient(this.serverUrl + this.documentCheckhUrl + ruleSet); var request = new RestRequest(Method.POST); request.AddHeader("content-type", "application/json"); request.AddHeader("authorization", "Bearer " + this.token); request.AddParameter("application/json", "{\n\t\"Xml\": \"" + text + "\",\n\t\"options\": {\n\t\t\"includeReporting\": true,\n\t\t\"extractTermCandidates\": true,\n\t\t\"includeContextMapping\": false\n\t}\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); CongreeCheckresult checkResult = JsonConvert.DeserializeObject<CongreeCheckresult>(response.Content); return checkResult; }
The entire class looks like shown below:
using Newtonsoft.Json; using RestSharp; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Congree { public class CongreeHttpClient { private string authUrl = "/congreeidentityserver/connect/token"; private string documentCheckhUrl = "/congree/api/Linguistic/v1/Check?ruleSet="; private string documentSettingsUrl = "/congree/api/Settings/v1/Document/"; private string serverUrl = ""; private string token = ""; public CongreeHttpClient(string serverUrl, string username, string password) { this.serverUrl = serverUrl; this.token = GetToken(username, password); } public string GetToken(string username, string password) { var client = new RestClient(this.serverUrl + this.authUrl); var request = new RestRequest(Method.POST); request.AddHeader("content-type", "application/x-www-form-urlencoded"); request.AddHeader("authorization", "Bearer undefined"); request.AddParameter("application/x-www-form-urlencoded", "grant_type=password&username=" + username + "&password=" + password + "&scope=webApi&client_id=CongreeWebAPI", ParameterType.RequestBody); IRestResponse response = client.Execute(request); AccessToken accessToken = new AccessToken(); accessToken = JsonConvert.DeserializeObject<AccessToken>(response.Content); this.token = accessToken.access_token; return this.token; } public CongreeCheckresult Check(string text, string ruleSet) { var client = new RestClient(this.serverUrl + this.documentCheckhUrl + ruleSet); var request = new RestRequest(Method.POST); request.AddHeader("content-type", "application/json"); request.AddHeader("authorization", "Bearer " + this.token); CongreeCheckRequest checkRequest = new CongreeCheckRequest(); checkRequest.Xml = text; JsonSerializerSettings settings = new JsonSerializerSettings(); settings.TypeNameHandling = TypeNameHandling.Auto; string serializedRequestJSON = JsonConvert.SerializeObject(checkRequest, settings); request.AddParameter("application/json", serializedRequestJSON, ParameterType.RequestBody); IRestResponse response = client.Execute(request); CongreeCheckresult checkResult = JsonConvert.DeserializeObject<CongreeCheckresult>(response.Content); return checkResult; } public string[] GetDocumentRules() { string[] rules; var client = new RestClient(this.serverUrl + this.documentSettingsUrl); var request = new RestRequest(Method.GET); request.AddHeader("content-type", "application/json"); request.AddHeader("authorization", "Bearer " + this.token); IRestResponse response = client.Execute(request); rules = JsonConvert.DeserializeObject<string[]>(response.Content); return rules; } } }
The code above uses the class CongreeCheckRequest to allow for a creation of a JSON compliant object that is being passed to Congree's REST API
using System; using System.Collections.Generic; using System.Text; namespace Congree { class CongreeCheckRequest { // Input for the linguistic checker.Must be valid XML. public string Xml { get; set; } // Check options public CongreeCheckOptions options { get; set; } public CongreeCheckRequest() { this.options = new CongreeCheckOptions(); } } }
In this class we are using another helper class to configure the different check and response options.
using System; using System.Collections.Generic; using System.Text; namespace Congree { public class CongreeCheckOptions { // Specifies whether valid terms should be included in result public bool includeValidTerms { get; set; } // Specifies whether linguistic report should be generated , public bool includeReporting { get; set; } // Specifies whether context bounds(<?cngr-ctx-b { ContextId}?> ... <? cngr-ctx-e {ContextId}?> blocks) should be included in output XML, public bool includeContextMapping { get; set; } // Specifies whether to perform terminology candidates extraction public bool extractTermCandidates { get; set; } public CongreeCheckOptions() { this.includeValidTerms = true; this.includeReporting = true; this.includeContextMapping = true; this.extractTermCandidates = true; } } }
The Check function uses the token obtain during the authentication. The API returns a JSON object that is being deserialized. The class CongreeCheckresult is shown below.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CongreeProofReader.Congree { public class CongreeCheckresult { public string ResultXml { get; set; } public IList<Error> Errors { get; set; } public Reporting Reporting { get; set; } } public class Error { public string Id { get; set; } public string ContextId { get; set; } public string Type { get; set; } public IList<ErrorDescription> Descriptions { get; set; } public IList<Proposal> Proposals { get; set; } public IList<TermCandidate> TermCandidates { get; set; } public Reporting Reporting { get; set; } } public class ErrorDescription { public string Code { get; set; } public Description Description { get; set; } public IList<ErrorExplanation> Explanation { get; set; } public IList<ErrorExplanationRewrite> ExplanationRewrite { get; set; } } public class Description { public string Header { get; set; } public string Instruction { get; set; } public string Explanation { get; set; } } public class ErrorExplanation { public string Type { get; set; } public string Text { get; set; } } public class ErrorExplanationRewrite { public string Type { get; set; } public string Text { get; set; } } public class Proposal { public string Text { get; set; } public string AdditionalInfo { get; set; } public string BaseTermForm { get; set; } public string ConceptId { get; set; } } public class TermCandidate { public string Id { get; set; } public string Text { get; set; } public string Context { get; set; } public bool IsExists { get; set; } } public class Reporting { public string TotalCheckedWords { get; set; } public string ReleaseLevel { get; set; } public string RelativeReleaseLevel { get; set; } public string SafeReleaseLevel { get; set; } public string SafeReleaseLevelTitle { get; set; } public string AcceptableReleaseLevel { get; set; } public string UnsafeReleaseLevel { get; set; } public string UnsafeReleaseLevelTitle { get; set; } public IList<ReportingByTypes> ReportingByTypes { get; set; } } public class ReportingByTypes { public string Type { get; set; } public string ErrorCount { get; set; } public string Severity { get; set; } public string RelativeSeverity { get; set; } public string Terminology { get; set; } public string Spelling { get; set; } public string Grammar { get; set; } public string Style { get; set; } public string Abbreviation { get; set; } } }