Last active
April 26, 2022 23:06
-
-
Save craigrbruce/5590714 to your computer and use it in GitHub Desktop.
Revisions
-
craigrbruce revised this gist
May 16, 2013 . 1 changed file with 2 additions and 2 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,7 +1,7 @@ /* Call the api client like this: var client = new ApiClient<SEnvelope>("https://baseurl.com/api/v1"); //you would overload and add an auth_token param here client.GetDtoAsync("envelopes", "object_id", (response) => //callback { @@ -12,7 +12,7 @@ [Test] public void can_get_envelope_from_api() { var client = new ApiClient<SEnvelope>("https://baseurl.com/api/v1"); var resetEvent = new ManualResetEvent(false); client.GetDtoAsync("envelopes", "object_id", (response) => -
craigrbruce revised this gist
May 16, 2013 . 1 changed file with 2 additions and 2 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -29,7 +29,7 @@ public void can_get_envelope_from_api() namespace foo.bar { public class Dto { @@ -45,7 +45,7 @@ public class Dto /// <summary> /// Constructor /// </summary> /// <param name="serviceBaseUrl">e.g. https://baseurl.com/api/v1</param> public ApiClient (String serviceBaseUrl) { this.serviceBaseUrl = serviceBaseUrl; -
craigrbruce revised this gist
May 16, 2013 . 1 changed file with 36 additions and 14 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,18 +1,40 @@ /* Call the api client like this: var client = new ApiClient<SEnvelope>("https://covata.com/api/v1"); //you would overload and add an auth_token param here client.GetDtoAsync("envelopes", "object_id", (response) => //callback { this.SEnvelope = response.Data;//should be an envelope from the server }); Integration / Unit Test Async calls like this: [Test] public void can_get_envelope_from_api() { var client = new ApiClient<SEnvelope>("https://covata.com/api/v1"); var resetEvent = new ManualResetEvent(false); client.GetDtoAsync("envelopes", "object_id", (response) => { Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); //other assertions here resetEvent.Set(); }); resetEvent.WaitOne(); } */ namespace com.cocoondata.api.client { public class Dto { public String ObjectId{ get; set; } /* Other common properties here */ } public class ApiClient<T> where T : Dto, new() @@ -23,7 +45,7 @@ public class Dto{ /// <summary> /// Constructor /// </summary> /// <param name="serviceBaseUrl">e.g. https://covata.com/api/v1</param> public ApiClient (String serviceBaseUrl) { this.serviceBaseUrl = serviceBaseUrl; -
craigrbruce created this gist
May 16, 2013 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,206 @@ using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Text; using RestSharp; using System.Linq; namespace com.cocoondata.api.client { public class Dto{ public String ObjectId{ get; set; } /* Other common properties */ } public class ApiClient<T> where T : Dto, new() { private const String JsonContentType = "application/json; charset=utf-8"; private readonly string serviceBaseUrl; /// <summary> /// Constructor /// </summary> /// <param name="serviceBaseUrl">e.g. https://so3.covata.com/sewc</param> public ApiClient (String serviceBaseUrl) { this.serviceBaseUrl = serviceBaseUrl; } public HttpStatusCode PostDtoSync (T dto, String resource) { var client = new RestClient (serviceBaseUrl); var request = CreateJsonRequest (resource); request.AddBody (dto); request.Method = Method.POST; var response = client.Execute (request); return response.StatusCode; } public void PostDtoAsync (T dto, string resource, Action<IRestResponse> callback) { var client = new RestClient (serviceBaseUrl); var request = CreateJsonRequest (resource); request.AddBody (dto); request.Method = Method.POST; client.ExecuteAsync (request, callback); } public HttpStatusCode DeleteDto (String resource, String userId, String itemId) { var client = new RestClient (serviceBaseUrl); RestRequest request = CreateDeleteRequest (resource, userId, itemId); var response = client.Execute (request); return response.StatusCode; } public HttpStatusCode DeleteDto (String resource, String userId, long itemId) { return DeleteDto (resource, userId, itemId.ToString ()); } public void DeleteDtoAsync (String resource, String userId, long itemId, Action<IRestResponse> callback) { DeleteDtoAsync (resource, userId, itemId.ToString (), callback); } public void DeleteDtoAsync (String resource, String userId, String itemId, Action<IRestResponse> callback) { var client = new RestClient (serviceBaseUrl); RestRequest request = CreateDeleteRequest (resource, userId, itemId); client.ExecuteAsync (request, callback); } public void GetDtoAsync (String resource, String id, Action<IRestResponse> callback) { var client = new RestClient (serviceBaseUrl); var request = CreateJsonRequest (resource); request.AddParameter ("id", id, ParameterType.GetOrPost); client.ExecuteAsync (request, callback); } public IList<T> GetDtoList (string resource, string userId) { var client = new RestClient (serviceBaseUrl); var request = CreateJsonRequest (resource); request.AddParameter ("id", userId, ParameterType.GetOrPost); try{ var response = client.Execute<List<T>> (request); return response.Data; }catch(Exception ex){ Console.Out.WriteLine (ex.ToString()); return null; } } public void GetDtoListAsync (string resource, string userId, Action<IRestResponse<List<T>>> callback, IDictionary<String, object> parameters = null) { var client = new RestClient (serviceBaseUrl); var request = CreateJsonRequest (resource); request.AddParameter ("id", userId, ParameterType.GetOrPost); if (parameters != null && parameters.Keys.Count > 0) { foreach (var key in parameters.Keys) { request.AddParameter (key, parameters[key], ParameterType.GetOrPost); } } client.ExecuteAsync (request, callback); } public void UploadImage (byte[] byteArray, string imageName, string fileExtension, string userId, Action callback) { var mem = new MemoryStream (byteArray) { Position = 0 }; mem.Seek (0, SeekOrigin.Begin); var request = WebRequest.Create (serviceBaseUrl + "image"); request.Headers.Add ("imageName", imageName); request.Headers.Add ("fileExtension", fileExtension); request.Headers.Add ("userId", userId); request.Method = "POST"; var requestState = new RequestState { Request = request, WriteStream = mem, Callback = callback }; //no waiting or response retrieval here. just fire and forget request.BeginGetRequestStream (RequestCallback, requestState); } private static void RequestCallback (IAsyncResult ar) { var requestState = (RequestState)ar.AsyncState; var responseStream = requestState.Request.EndGetRequestStream (ar); requestState.WriteStream.CopyTo (responseStream); requestState.WriteStream.Flush (); responseStream.Close (); requestState.Request.BeginGetResponse ((a) => { Console.Out.WriteLine ("Uploaded image"); if (requestState.Callback != null) { requestState.Callback (); } }, null); } private RestRequest CreateDeleteRequest (string resource, string userId, string itemId) { var request = new RestRequest (resource, Method.DELETE); request.AddParameter ("userId", userId, ParameterType.GetOrPost); request.AddParameter ("id", itemId, ParameterType.GetOrPost); return request; } private IRestRequest CreateJsonRequest (String resource) { var request = new RestRequest (resource) { RequestFormat = DataFormat.Json, JsonSerializer = { ContentType = JsonContentType }, // You can set all your defaults here, e.g. Date format: //DateFormat = "ISO 8601" }; return request; } } // The RequestState class passes data across async calls. public class RequestState { public Stream WriteStream; public WebRequest Request; public Stream ResponseStream; public Action Callback; public RequestState () { Request = null; ResponseStream = null; WriteStream = null; Callback = null; } } }