Skip to content

Wallsmedia/DotNet.RestApi.Client

Repository files navigation

Dot Net Core Rest Web Api Client

The convenient Web Rest Api Client for the Rest Web Service at the Docker Container.

Version 3.1.0

  • Add support of .Net Core 3.1
  • Add support of .Net Standard 2.1

Version 3.0.0

  • Add support of .Net Core 3.0
  • Add support of .Net Standard 2.1

Version 2.4.0

  • Add support of IHttpClientFactory
  • Add support of IHttpClientFactory

Nuget Package:

https://www.nuget.org/packages/DotNet.RestApi.Client/

Example of using with IHttpClientFactory ASP.NET Core

Last Release Version 3.1.0 Working samples - https://github.com/Wallsmedia/DotNet.RestApi.Client/tree/master/sample

Add to the configuration initialization:

  public void ConfigureServices(IServiceCollection services)
  {
  ...
        services.AddHttpClient<RestApiClient>();
  }
Using "Polly"
  public void ConfigureServices(IServiceCollection services)
  {
  ...
     //services.AddTransient<RestApiClient>();
     services.AddHttpClient<RestApiClient>().AddTransientHttpErrorPolicy(p => p.RetryAsync(3, onRetry: (res, count) =>
     {
         // for debug demo messaging
         Console.WriteLine($" Exception:{res.Exception.Message} count: {count}");
     }));
  }

For more details of using Polly use link below:

In the controller:

    private RestApiClient _restApiClient;

    /// <summary>
    /// Constructs the class.
    /// </summary>
    /// <param name="configuration">The capture processor configuration.</param>
    /// <param name="logFactory">The logger factory.</param>
    public MarketCaptureController(RestApiClient restApiClient,
        MarketCaptureProcessorServiceConfiguration configuration,
        ILoggerFactory logFactory)
    {
        _restApiClient = restApiClient;
        restApiClient.ConfigureHttpRequstMessage = RestApiClientExtensions.ApplyAcceptEncodingSettingGZip;

        Configuration = configuration;
        _logFactory = logFactory;
        _logInfo = _logFactory?.CreateLogger(Assembly.GetExecutingAssembly().GetName().Name);

    }

    private void GetBitCoinRate(object state)
    {

        try
        {
            Uri baseUri = new Uri(Configuration.BitCoinRequestUrl);
            baseUri = new Uri("https://api.coinmarketcap.com/v1/ticker/bitcoin/?convert=EUR");
            var response = _restApiClient.SendJsonRequest(HttpMethod.Get, baseUri, null).GetAwaiter().GetResult();
            var bitcoin = response.DeseriaseJsonResponseAsync<TickerBitcoin[]>().GetAwaiter().GetResult();
            LastMarketTop = bitcoin[0];
            LogMessageResources.TraceBitCoinPrice(_logInfo, bitcoin[0].LastUpdatedUTC, bitcoin[0].price_eur, null);
        }
        catch (Exception e)
        {
            LogMessageResources.OperationException(_logInfo, nameof(MarketCaptureProcessor), e);
        }
    }

Example how to call with JSON:

Uri baseUri = new Uri("http://webServiceHost:15002");
RestApiClient client = new RestApiClient(baseUri);

PurchaseOrder sendObj = new PurchaseOrder();

HttpResponseMessage response = client.SendJsonRequest(HttpMethod.Post, new Uri("res", UriKind.Relative), sendObj).Result;

PurchaseOrder respObj = response.DeseriaseJsonResponse<PurchaseOrder>();

Example how to call with XML:

Uri baseUri = new Uri("http://webServiceHost:15002");
RestApiClient client = new RestApiClient(baseUri, request =>
   {
      request.Headers.Add("CustomHeader", "CustomHeaderValue");
   });

PurchaseOrder sendObj = new PurchaseOrder();

Uri relUri = new Uri(RequestPathAttribute.GetRestApiPath(sendObj), UriKind.Relative);
HttpResponseMessage response = client.SendJsonRequest(HttpMethod.Post, relUri, sendObj).Result;

PurchaseOrder respObj = response.DeseriaseXmlResponse<PurchaseOrder>();

Example how to call with using gzip:

Uri baseUri = new Uri("http://webServiceHost:15002");
RestApiClient client = new RestApiClient(baseUri, request =>
   {
      request.Headers.Add("CustomHeader", "CustomHeaderValue");
      RestApiClientExtensions.ApplyAcceptEncodingSettingGZip(request);
   });

PurchaseOrder sendObj = new PurchaseOrder();

HttpResponseMessage response = client.SendXmlRequest(HttpMethod.Post, new Uri("res", UriKind.Relative), sendObj).Result;

PurchaseOrder respObj = response.DeseriaseXmlResponse<PurchaseOrder>();

Where Web Service should have:

 public void ConfigureServices(IServiceCollection services)
 {
 ...
     services.AddResponseCompression();
 ...
 }
 public void Configure(IApplicationBuilder app)
 {
 ...
     app.UseResponseCompression();
 ...
 }

Example how to call with Data Contract XML:

Uri baseUri = new Uri("http://webServiceHost:15002");
RestApiClient client = new RestApiClient(baseUri);

PurchaseOrder sendObj = new PurchaseOrder();
Uri relUri = new Uri(RequestPathAttribute.GetRestApiPath(sendObj), UriKind.Relative);
HttpResponseMessage response = client.SendJsonRequest(HttpMethod.Post, relUri, sendObj).Result;

PurchaseOrder respObj = response.DeseriaseDcXmlResponse<PurchaseOrder>();

Where the Models:

   [DataContract (Namespace ="http://purchase.Interface.org/Purchase.Order")]
   [RequestPath("add/purchase/order")]
   public class PurchaseOrder
    {
        public PurchaseOrder()
        {
            billTo = new Address() { street = "Bill to Address" };
            shipTo = new Address() { street = "Ship to  Address" };
        }
        [DataMember]
        public Address billTo;
        [DataMember]
        public Address shipTo;
    }


    [DataContract(Namespace = "http://purchase.Interface.org/Purchase.Order.Address")]
    public class Address
    {
        [DataMember]
        public string street;
    }