/
Sample Code
Sample Code
The following code is in C#. It gives an idea on how to use the WebRequest class of .Net with the API.
Use this code as a basis for your developments. However keep in mind:
- The sample code does basic error handling only. For example you would need to intercept exceptions systematically.
- The sample code is all synchronous. If you are calling the API on a UI thread you should switch to asynchronous approaches (while still using the WebRequest class).
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) { 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; } 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; } } } }
, multiple selections available,
Related content
Get an invoice
Get an invoice
More like this
Accessing API from software
Accessing API from software
More like this
Asynchronous operations
Asynchronous operations
More like this
API - IT - Submit New Request
API - IT - Submit New Request
Read with this
API - IT - Download Translation
API - IT - Download Translation
Read with this
Test status of an asynchronous operation by id
Test status of an asynchronous operation by id
More like this
Copyright Wordbee - Buzzin' Outside the Box since 2008