Jekyll2021-03-12T19:55:57+00:00https://mhkarami97.github.io/blog-en/feed.xmlpersonal blogmy personal blogMohammad Hossein KaramiCreate http request with flurl and polly2021-01-11T09:46:00+00:002021-01-11T09:46:00+00:00https://mhkarami97.github.io/blog-en/core/flurl_with_polly<p>Making http request is not easy to handle. for example dns changing, just create single HttpClient and …
<br />
also it’s need some default cofig and inject HttpClient to call api
<br />
Flurl is a library to make http request in simplest way
<br />
Polly is a library to automatic retry method if it riase expection
<br />
<br />
repository links:
<br />
<a href="https://github.com/App-vNext/Polly">polly github</a><br />
<a href="https://github.com/tmenier/Flurl">flurl github</a><br />
<br />
working with flurl is very easy and it’s not need any config or dependency injection
<br />
now you can use it like this:
<br /></p>
<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">var</span> <span class="n">result</span> <span class="p">=</span> <span class="k">await</span> <span class="s">"https://api.com"</span>
<span class="p">.</span><span class="nf">SetQueryParams</span><span class="p">(</span><span class="k">new</span> <span class="p">{</span> <span class="n">api_key</span> <span class="p">=</span> <span class="s">"abc"</span> <span class="p">})</span>
<span class="p">.</span><span class="nf">WithOAuthBearerToken</span><span class="p">(</span><span class="s">"my_token"</span><span class="p">)</span>
<span class="p">.</span><span class="nf">PostJsonAsync</span><span class="p">(</span><span class="k">new</span> <span class="p">{</span> <span class="n">first_name</span> <span class="p">=</span> <span class="n">firstName</span><span class="p">,</span> <span class="n">last_name</span> <span class="p">=</span> <span class="n">lastName</span> <span class="p">})</span>
<span class="p">.</span><span class="n">ReceiveJson</span><span class="p"><</span><span class="n">T</span><span class="p">>();</span>
</code></pre></div></div>
<p>thre is no need to inject any HttpClient, you need just your url as string to call eat
<br />
we use these items:
<br /></p>
<ul>
<li>SetQueryParams : add custom parameter to url</li>
<li>WithOAuthBearerToken : add auth token to header</li>
<li>PostJsonAsync : data that send as post method</li>
<li>ReceiveJson : result as json</li>
</ul>
<p>also there are more method that you can see in <a href="https://flurl.dev/docs/fluent-http">this link</a>
<br />
or use it like ReceiveJson() to make result type dynamic
or add custom header to your request
<br />
and any thing else that HttpClient has and you need to work with rest api
<br />
<br />
this library has very good exception handling.
<br />
we can define some status code to prevent exception or make it default to raise exception in result status code is not 200:</p>
<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">url</span><span class="p">.</span><span class="nf">AllowHttpStatus</span><span class="p">(</span><span class="s">"400-404,6xx"</span><span class="p">).</span><span class="nf">GetAsync</span><span class="p">();</span>
<span class="n">url</span><span class="p">.</span><span class="nf">AllowAnyHttpStatus</span><span class="p">().</span><span class="nf">GetAsync</span><span class="p">();</span>
</code></pre></div></div>
<p>if we impact error, this exceptions raise:</p>
<ul>
<li>FlurlHttpTimeoutException</li>
<li>FlurlHttpException</li>
</ul>
<p>for example it modes that api return some info when exception happend.</p>
<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">return</span> <span class="k">await</span> <span class="n">ex</span><span class="p">.</span><span class="nf">GetResponseJsonAsync</span><span class="p">()</span> <span class="p">??</span>
<span class="n">ex</span><span class="p">.</span><span class="nf">GetBaseException</span><span class="p">().</span><span class="n">Message</span><span class="p">;</span>
</code></pre></div></div>
<p>one of most important item that you should pat attention on it, is not create multi HttpClient in single call. this problem is handle currently by <a href="https://flurl.dev/docs/client-lifetime">this library</a>
<br />
this library is familier with test, also has fake implementation that you can see it in <a href="https://flurl.dev/docs/testable-http/">this link</a></p>
<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">[</span><span class="n">Test</span><span class="p">]</span>
<span class="k">public</span> <span class="k">void</span> <span class="nf">Test_Some_Http_Calling_Method</span><span class="p">()</span> <span class="p">{</span>
<span class="k">using</span> <span class="p">(</span><span class="kt">var</span> <span class="n">httpTest</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">HttpTest</span><span class="p">())</span> <span class="p">{</span>
<span class="n">sut</span><span class="p">.</span><span class="nf">CallThingThatUsesFlurlHttp</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p><br />
one of best library to retry code for example when time out happend, is Polly.
<br />
we can use it like this:
<br /></p>
<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">private</span> <span class="k">readonly</span> <span class="n">AsyncRetryPolicy</span> <span class="n">_polly</span><span class="p">;</span>
<span class="k">public</span> <span class="nf">MyConstructor</span><span class="p">()</span>
<span class="p">{</span>
<span class="n">_polly</span> <span class="p">=</span> <span class="n">Policy</span>
<span class="p">.</span><span class="n">Handle</span><span class="p"><</span><span class="n">FlurlHttpTimeoutException</span><span class="p">>()</span>
<span class="p">.</span><span class="nf">WaitAndRetryAsync</span><span class="p">(</span><span class="k">new</span><span class="p">[]</span>
<span class="p">{</span>
<span class="n">TimeSpan</span><span class="p">.</span><span class="nf">FromSeconds</span><span class="p">(</span><span class="m">1</span><span class="p">),</span>
<span class="n">TimeSpan</span><span class="p">.</span><span class="nf">FromSeconds</span><span class="p">(</span><span class="m">2</span><span class="p">)</span>
<span class="p">});</span>
<span class="p">}</span>
</code></pre></div></div>
<p>in Handle we can say that witch exceptin we want to retry, for example if FlurlHttpTimeoutException happen, we retry code
<br />
after that we define retry count in WaitAndRetryAsync
<br />
in this example we say that retry 2 times and in first time, wait 1 second and then wait 2 second
<br />
know we can use this code in every where we want:</p>
<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">var</span> <span class="n">result</span> <span class="p">=</span> <span class="k">await</span> <span class="n">_polly</span>
<span class="p">.</span><span class="nf">ExecuteAsync</span><span class="p">(</span><span class="k">async</span> <span class="n">ct</span> <span class="p">=></span>
<span class="k">await</span> <span class="nf">MyMethod</span><span class="p">(),</span>
<span class="n">cancellationToken</span><span class="p">);</span>
</code></pre></div></div>
<p>for example if we want use it by flurl, we can do this:</p>
<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">var</span> <span class="n">result</span> <span class="p">=</span> <span class="k">await</span> <span class="n">_polly</span>
<span class="p">.</span><span class="nf">ExecuteAsync</span><span class="p">(</span><span class="k">async</span> <span class="n">ct</span> <span class="p">=></span>
<span class="k">await</span> <span class="n">BaseInfo</span><span class="p">.</span><span class="n">WebApiAddress</span>
<span class="p">.</span><span class="nf">AppendPathSegment</span><span class="p">(</span><span class="s">"auth"</span><span class="p">)</span>
<span class="p">.</span><span class="nf">WithHeader</span><span class="p">(</span><span class="n">abc</span><span class="p">,</span>
<span class="s">"in header"</span><span class="p">)</span>
<span class="p">.</span><span class="nf">PostJsonAsync</span><span class="p">(</span><span class="k">new</span>
<span class="p">{</span>
<span class="n">Username</span> <span class="p">=</span> <span class="n">userUserName</span><span class="p">,</span>
<span class="n">Password</span> <span class="p">=</span> <span class="n">userPassword</span>
<span class="p">},</span> <span class="n">ct</span><span class="p">).</span><span class="n">ReceiveJson</span><span class="p"><</span><span class="n">ResultInfo</span><span class="p">>(),</span>
<span class="n">cancellationToken</span><span class="p">);</span>
</code></pre></div></div>Mohammad Hossein KaramiMaking http request is not easy to handle. for example dns changing, just create single HttpClient and … also it’s need some default cofig and inject HttpClient to call api Flurl is a library to make http request in simplest way Polly is a library to automatic retry method if it riase expection repository links: polly github flurl github working with flurl is very easy and it’s not need any config or dependency injection now you can use it like this:Start2020-12-16T21:41:00+00:002020-12-16T21:41:00+00:00https://mhkarami97.github.io/blog-en/blog/start<p>this is start of my blog</p>
<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">while</span><span class="p">(</span><span class="n">life</span><span class="p">){</span>
<span class="n">console</span><span class="p">.</span><span class="nf">writeLine</span><span class="p">(</span><span class="s">"coding ..."</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<p>more link : <br />
[about me]: https://mhkarami97.github.io<br />
[website]: https://itarfand.com<br />
[youtube]: http://youtube.com/channel/UCaRptrYsQnTAdxYoYpAANsw
[github]: https://github.com/mhkarami97</p>Mohammad Hossein Karamithis is start of my blog