Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.IO.Compression;
using System.Net;
using Newtonsoft.Json.Linq;
namespace UnitTestProject1
{

	/// <summary>
	/// Sample proxy class to use the API.
	/// 
	/// Please note:
	/// 
	/// - This class only implements very basic error handling.
	///   In production code, full error handling needs to be implemented.
	/// 
	/// - API calls running in a UI should be better implemented using asynchronous web calls.
	/// 
	/// </summary>
	public class ApiProxy
	{
		// The API end point
		private string mApiUrl;
		/// <summary>
 

		/// Constructor
		/// </summary>
		/// <param name="apiurl"></param>
		public ApiProxy(string apiurl)
		{
			mApiUrl = apiurl;
		}
 

		/// <summary>
		/// Connect and get token.
		/// Throws exception if anything fails.
		/// </summary>
		/// <param name="domain"></param>
		/// <param name="ui"></param>
		/// <returns></returns>
		public string Connect(string account, string login, string pwd, string domain, string ui)
		{
			// Parameters
			UriBuilderExt ub = new UriBuilderExt(string.Format("{0}/api/connect", mApiUrl));
			ub.AddParameter("account", account);
			ub.AddParameter("login", login);
			ub.AddParameter("pwd", pwd);
			ub.AddParameter("domain", domain);
			ub.AddParameter("ui", ui);
			// Create request
			var request = WebRequest.Create(ub.Uri);
			request.Method = "GET";
			// Submit
			bool error;
			JObject json = GetJsonResult(request, out error);
			// If there is an error, we should handle it better than this:
			if (error) throw new Exception(json.ToString());
			// Ok let's get the session token
			return (string)json["token"];
		}



		/// <summary>
		/// Connect and get token.
		/// Throws exception if anything fails.
		/// </summary>
		/// <param name="domain"></param>
		/// <param name="ui"></param>
		/// <returns></returns>
		public void Disconnect(string token)
		{
			// Parameters
			UriBuilderExt ub = new UriBuilderExt(string.Format("{0}/api/disconnect", mApiUrl));
			ub.AddParameter("token", token);
			// Create request
			var request = WebRequest.Create(ub.Uri);
			request.Method = "PUT";
			request.ContentType = "application/json";
			request.ContentLength = 0;
			using (WebResponse response = request.GetResponse())
			{
				var status = ((HttpWebResponse)response).StatusCode;
			}
		}



		/// <summary>
		/// Connect and get token.
		/// Throws exception if anything fails.
		/// </summary>
		/// <param name="domain"></param>
		/// <param name="ui"></param>
		/// <returns></returns>
		public JObject GetConfiguration(string token, int option)
		{
			// Parameters
			UriBuilderExt ub = new UriBuilderExt(string.Format("{0}/api/it/configuration", mApiUrl));
			ub.AddParameter("token", token);
			ub.AddParameter("option", option.ToString());
			var request = WebRequest.Create(ub.Uri);
			request.Method = "GET";
			// Submit
			bool error;
			JObject json = GetJsonResult(request, out error);
			if (error) throw new Exception(json.ToString());
			return json;
		}



		/// <summary>
		/// Connect and get token.
		/// Throws exception if anything fails.
		/// </summary>
		/// <param name="domain"></param>
		/// <param name="ui"></param>
		/// <returns></returns>
		public int SubmitRequest(string token, string filepath, string src, string trg, int option, int foption)
		{
			// Parameters
			UriBuilderExt ub = new UriBuilderExt(string.Format("{0}/api/it/requests", mApiUrl));
			ub.AddParameter("token", token);
			ub.AddParameter("filename", Path.GetFileName(filepath));
			ub.AddParameter("src", src);
			ub.AddParameter("trg", trg);
			ub.AddParameter("option", option.ToString());
			ub.AddParameter("foption", foption.ToString());
			// Create request
			var request = WebRequest.Create(ub.Uri);
			request.Method = "POST";
			request.ContentType = "stream";
			request.Timeout = 1000 * 360;	// 1 sec * 100
			// Upload file
			using (Stream requeststream = request.GetRequestStream())
			{
				using (Stream filestream = File.OpenRead(filepath))
				{
					using (DeflateStream dstream = new DeflateStream(requeststream, CompressionMode.Compress, true))
					{
						filestream.CopyTo(dstream);
					}
				}
			}
				
			// Get response
			bool error;
			JObject result = GetJsonResult(request, out error);
			if (error) throw new Exception();
			int id = (int)result["id"];
			return id;
		}



		/// <summary>
		/// Connect and get token.
		/// Throws exception if anything fails.
		/// </summary>
		/// <param name="domain"></param>
		/// <param name="ui"></param>
		/// <returns></returns>
		public string DownloadTranslation(string token, int requestId)
		{
			// Parameters
			UriBuilderExt ub = new UriBuilderExt(string.Format("{0}/api/it/requests/file", mApiUrl));
			ub.AddParameter("token", token);
			ub.AddParameter("id", requestId.ToString());
			// Create request
			var request = WebRequest.Create(ub.Uri);
			request.Method = "GET";
			// Get file
			usingreturn DownloadTranslation(WebResponse response = request.GetResponse());
			{}

		/// <summary>
		var status = ((HttpWebResponse)response).StatusCode;
				if (status == HttpStatusCode.BadRequest)
				{
					// If 200 or 400 we have JSON!
					using (var stream = response.GetResponseStream())
					{
						var eresult = (new StreamReader(stream)).ReadToEnd();
						JObject jerror = JObject.Parse(eresult);
						throw new Exception("Oups: " + jerror.ToString());
					}
				}
				else if (status == HttpStatusCode.OK)
				{
	/// Connect and get token.
		/// Throws exception if anything fails.
		/// </summary>
		/// <param name="domain"></param>
		/// <param name="ui"></param>
		/// <returns></returns>
		public void SubmitPostEditRequest(string token, List<int> ids)
		{
			// Parameters
			UriBuilderExt ub = new UriBuilderExt(string.Format("{0}/api/it/requests/postedit", mApiUrl));
			ub.AddParameter("token", token);
			ub.AddParameter("ids", string.Join(",", ids));
			ub.AddParameter("reference", "My reference");
			ub.AddParameter("deadline", DateTime.UtcNow.AddDays(1).ToString("o"));
			ub.AddParameter("comments", "");
			// Create request
			var request = WebRequest.Create(ub.Uri);
			request.Method = "POST";
			request.ContentType = "application/json";
			request.ContentLength = 0;
			using (WebResponse response = request.GetResponse())
			{
				var status = ((HttpWebResponse)response).StatusCode;
			}
		}

		/// <summary>
		/// Connect and get token.
		/// Throws exception if anything fails.
		/// </summary>
		/// <param name="domain"></param>
		/// <param name="ui"></param>
		/// <returns></returns>
		public string DownloadPostEdit(string token, int requestId)
		{
			// Parameters
			UriBuilderExt ub = new UriBuilderExt(string.Format("{0}/api/it/requests/postedit/file", mApiUrl));
			ub.AddParameter("token", token);
			ub.AddParameter("id", requestId.ToString());
			// Create request
			var request = WebRequest.Create(ub.Uri);
			request.Method = "GET";
			request.ContentType = "application/json";
			request.ContentLength = 0;
			// Get file
			return DownloadTranslation(request);
		}

		/// <summary>
		/// Generic method to download a gzip compressed file.
		/// </summary>
		/// <param name="response"></param>
		/// <returns></returns>
		private string DownloadTranslation(WebRequest request)
		{
			WebResponse response = null;
			try
			{
				// Get the response.
				// In case we have an error status 400 from Beebox we get an exception.
				try
				{
					response = request.GetResponse();
				}
				catch (WebException ex)
				{
					// Handle API originating errors (HTTP error = 400) containing a JSON
					if (ex.Response is HttpWebResponse && (ex.Response as HttpWebResponse).StatusCode == HttpStatusCode.BadRequest)
					{
						using (var stream = ex.Response.GetResponseStream())
						{
							using (var reader = new StreamReader(stream))
							{
								JObject jerror = JObject.Parse(reader.ReadToEnd());
								throw new Exception("Oups: " + jerror.ToString());
							}
						}
					}
					// Something else, we rethrow
					throw;
				}

				// Make sure we have OK status
				var status = ((HttpWebResponse)response).StatusCode;
				if (status != HttpStatusCode.OK) throw new Exception("Oups!");
				// Download file
				string temppath = null;
					try
					{
						using (var stream = response.GetResponseStream())
						{
						// Decompress
						using (DeflateStream dfstream = new DeflateStream(stream, CompressionMode.Decompress, true))
							{
								temppath = Path.GetTempFileName();
								using (Stream targetstream = File.OpenWrite(temppath))
								{
									dfstream.CopyTo(targetstream);
								}
							}
						}
						return temppath;
				}
				catch
				{
						}
					catch
					{
	// In case of error we delete the temp file
					if (temppath != null) File.Delete(temppath);
						throw;
					}
				}
				elsefinally
				{
					throw new Exception("Oups");
				}if (response != null) response.Dispose();
			}
		}


 

		/// <summary>
		/// Gets JSON result **synchronously**.
		/// If HTTP result status is neither 200 nor 400, an exception is raised.
		/// </summary>
		/// <param name="request">The web request</param>
		/// <param name="error">
		/// False: Json is the success result. 
		/// True: Json is the API error result which contains the error message etc.
		/// </param>
		/// <returns>JSON</returns>
		private JObject GetJsonResult(WebRequest request, out bool error)
		{
			using (WebResponse response = request.GetResponse())
			{
				var status = ((HttpWebResponse)response).StatusCode;
				if (status == HttpStatusCode.BadRequest || status == HttpStatusCode.OK)
				{
					// If 200 or 400 we have JSON!
					using (var stream = response.GetResponseStream())
					{
						var eresult = (new StreamReader(stream)).ReadToEnd();
						JObject jerror = JObject.Parse(eresult);
						error = status == HttpStatusCode.BadRequest;
						return jerror;
					}
				}
				else
				{
					// A different error, we do not get JSON here
					// Might want to read the contents too for logging etc.
					throw new Exception(status.ToString());
				}
			}
		}

	}
 
 

	/// <summary>
	/// Helper class to add query parameters to an URI
	/// </summary>
	public class UriBuilderExt
	{
		private NameValueCollection collection;
		private UriBuilder builder;
		public UriBuilderExt(string uri) { builder = new UriBuilder(uri); collection = System.Web.HttpUtility.ParseQueryString(string.Empty); }
		public void AddParameter(string key, string value) { collection.Add(key, value); }
		public Uri Uri { get { builder.Query = collection.ToString(); return builder.Uri; } }
	}

}