...
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 return DownloadTranslation(request); } /// <summary> /// 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 { // In case of error we delete the temp file if (temppath != null) File.Delete(temppath); throw; } } finally { 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())null; try { var// statusGet =the ((HttpWebResponse)response).StatusCode; if (status == HttpStatusCode.BadRequest ||// In case we have an error status == HttpStatusCode.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; } 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()); } } finally { if (response != null) response.Dispose(); } } } /// <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; } } } } |