Skip to content

Instantly share code, notes, and snippets.

@craigrbruce
Last active April 26, 2022 23:06
Show Gist options
  • Save craigrbruce/5590714 to your computer and use it in GitHub Desktop.
Save craigrbruce/5590714 to your computer and use it in GitHub Desktop.

Revisions

  1. craigrbruce revised this gist May 16, 2013. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions ApiClient.cs
    Original 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://covata.com/api/v1");
    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://covata.com/api/v1");
    var client = new ApiClient<SEnvelope>("https://baseurl.com/api/v1");
    var resetEvent = new ManualResetEvent(false);
    client.GetDtoAsync("envelopes", "object_id", (response) =>
  2. craigrbruce revised this gist May 16, 2013. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions ApiClient.cs
    Original file line number Diff line number Diff line change
    @@ -29,7 +29,7 @@ public void can_get_envelope_from_api()



    namespace com.cocoondata.api.client
    namespace foo.bar
    {
    public class Dto
    {
    @@ -45,7 +45,7 @@ public class Dto
    /// <summary>
    /// Constructor
    /// </summary>
    /// <param name="serviceBaseUrl">e.g. https://covata.com/api/v1</param>
    /// <param name="serviceBaseUrl">e.g. https://baseurl.com/api/v1</param>
    public ApiClient (String serviceBaseUrl)
    {
    this.serviceBaseUrl = serviceBaseUrl;
  3. craigrbruce revised this gist May 16, 2013. 1 changed file with 36 additions and 14 deletions.
    50 changes: 36 additions & 14 deletions ApiClient.cs
    Original file line number Diff line number Diff line change
    @@ -1,18 +1,40 @@
    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
    /*
    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 class Dto
    {
    public String ObjectId{ get; set; }
    /* Other common properties */
    /* 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://so3.covata.com/sewc</param>
    /// <param name="serviceBaseUrl">e.g. https://covata.com/api/v1</param>
    public ApiClient (String serviceBaseUrl)
    {
    this.serviceBaseUrl = serviceBaseUrl;
  4. craigrbruce created this gist May 16, 2013.
    206 changes: 206 additions & 0 deletions ApiClient.cs
    Original 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;
    }
    }
    }