<?xml version="1.0" encoding="UTF-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title xmlns:ns="http://www.w3.org/2005/Atom" ns:type="text">HTTP clients – Haskell – Aelve Guide</title><id>https://guide.aelve.com/haskell/feed/category/lohjgbh4</id><updated>2018-06-14T04:16:33Z</updated><link xmlns:ns="http://www.w3.org/2005/Atom" ns:href="https://guide.aelve.com/haskell/feed/category/lohjgbh4"/><entry><id>m0i2mls5</id><title xmlns:ns="http://www.w3.org/2005/Atom" ns:type="text">wreq</title><updated>2018-06-14T04:16:33Z</updated><content xmlns:ns="http://www.w3.org/2005/Atom" ns:type="html">&lt;h1&gt;  &lt;span class=&#34;item-name&#34;&gt;wreq&lt;/span&gt;

  
  (&lt;a href=&#34;https://hackage.haskell.org/package/wreq&#34;&gt;Hackage&lt;/a&gt;)
&lt;/h1&gt;&lt;h2&gt;Pros&lt;/h2&gt;&lt;ul&gt;&lt;/ul&gt;&lt;h2&gt;Cons&lt;/h2&gt;&lt;ul&gt;&lt;/ul&gt;&lt;h2&gt;Notes&lt;/h2&gt;&lt;h1&gt;&lt;span id=&#34;item-notes-m0i2mls5-links&#34;&gt;&lt;/span&gt;Links&lt;/h1&gt;&lt;p&gt;&lt;a href=&#34;http://www.serpentine.com/wreq/&#34;&gt;wreq homepage (and tutorial)&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;&lt;span id=&#34;item-notes-m0i2mls5-imports&#34;&gt;&lt;/span&gt;Imports&lt;/h1&gt;&lt;p&gt;import Control.Lens
import Network.Wreq&lt;/p&gt;
&lt;h1&gt;&lt;span id=&#34;item-notes-m0i2mls5-usage&#34;&gt;&lt;/span&gt;Usage&lt;/h1&gt;&lt;p&gt;&lt;a href=&#34;http://bitemyapp.com/posts/2016-02-06-haskell-is-not-trivial-not-unfair.html&#34;&gt;bitemyapp walkthrough of a wreq usage&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;&lt;span id=&#34;item-notes-m0i2mls5-gotchas&#34;&gt;&lt;/span&gt;Gotchas&lt;/h1&gt;&lt;p&gt;Common mistakes and non-obvious things&lt;/p&gt;
</content><link xmlns:ns="http://www.w3.org/2005/Atom" ns:href="https://guide.aelve.com/haskell/http-clients-lohjgbh4#item-m0i2mls5"/></entry><entry><id>lk98x0le</id><title xmlns:ns="http://www.w3.org/2005/Atom" ns:type="text">req</title><updated>2018-06-14T04:16:30Z</updated><content xmlns:ns="http://www.w3.org/2005/Atom" ns:type="html">&lt;h1&gt;  &lt;span class=&#34;item-name&#34;&gt;req&lt;/span&gt;

  
  (&lt;a href=&#34;https://hackage.haskell.org/package/req&#34;&gt;Hackage&lt;/a&gt;)
&lt;/h1&gt;&lt;h2&gt;Pros&lt;/h2&gt;&lt;ul&gt;&lt;/ul&gt;&lt;h2&gt;Cons&lt;/h2&gt;&lt;ul&gt;&lt;/ul&gt;&lt;h2&gt;Notes&lt;/h2&gt;&lt;h1&gt;&lt;span id=&#34;item-notes-lk98x0le-links&#34;&gt;&lt;/span&gt;Links&lt;/h1&gt;&lt;p&gt;Links to tutorials, blog posts, etc.&lt;/p&gt;
&lt;h1&gt;&lt;span id=&#34;item-notes-lk98x0le-imports&#34;&gt;&lt;/span&gt;Imports&lt;/h1&gt;&lt;div class=&#34;sourceCode&#34;&gt;&lt;pre class=&#34;sourceCode&#34;&gt;&lt;code class=&#34;sourceCode&#34;&gt;&lt;span class=&#34;kw&#34;&gt;import qualified&lt;/span&gt; &lt;span class=&#34;dt&#34;&gt;Network.HTTP.Req&lt;/span&gt; &lt;span class=&#34;kw&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;dt&#34;&gt;R&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;&lt;span id=&#34;item-notes-lk98x0le-usage&#34;&gt;&lt;/span&gt;Usage&lt;/h1&gt;&lt;p&gt;[ see the hackage page for a commented example ]&lt;/p&gt;
&lt;h1&gt;&lt;span id=&#34;item-notes-lk98x0le-gotchas&#34;&gt;&lt;/span&gt;Gotchas&lt;/h1&gt;&lt;p&gt;The &lt;a href=&#34;urrrrrrrrrl&#34;&gt;req function&lt;/a&gt; uses type tricks that make [R.GET, R.PUT] not type-check. If you want to pass around request parameters use a GADT like:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34;&gt;&lt;pre class=&#34;sourceCode&#34;&gt;&lt;code class=&#34;sourceCode&#34;&gt;&lt;span class=&#34;co&#34;&gt;-- | A Request to be compiled into an IO action. Does not specify return type&lt;/span&gt;
&lt;span class=&#34;kw&#34;&gt;data&lt;/span&gt; &lt;span class=&#34;dt&#34;&gt;Request&lt;/span&gt; &lt;span class=&#34;kw&#34;&gt;where&lt;/span&gt;
  &lt;span class=&#34;dt&#34;&gt;Delete&lt;/span&gt;&lt;span class=&#34;ot&#34;&gt; ::&lt;/span&gt;                 &lt;span class=&#34;dt&#34;&gt;R.Url&lt;/span&gt; &lt;span class=&#34;ch&#34;&gt;&#39;R.Https      -&amp;gt; Option -&amp;gt; Request&lt;/span&gt;
  &lt;span class=&#34;dt&#34;&gt;Get&lt;/span&gt;&lt;span class=&#34;ot&#34;&gt;    ::&lt;/span&gt;                 &lt;span class=&#34;dt&#34;&gt;R.Url&lt;/span&gt; &lt;span class=&#34;ch&#34;&gt;&#39;R.Https      -&amp;gt; Option -&amp;gt; Request&lt;/span&gt;
  &lt;span class=&#34;dt&#34;&gt;Patch&lt;/span&gt;&lt;span class=&#34;ot&#34;&gt;  ::&lt;/span&gt; &lt;span class=&#34;dt&#34;&gt;R.HttpBody&lt;/span&gt; a &lt;span class=&#34;ot&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;dt&#34;&gt;R.Url&lt;/span&gt; &lt;span class=&#34;ch&#34;&gt;&#39;R.Https -&amp;gt; a -&amp;gt; Option -&amp;gt; Request&lt;/span&gt;
  &lt;span class=&#34;dt&#34;&gt;Put&lt;/span&gt;&lt;span class=&#34;ot&#34;&gt;    ::&lt;/span&gt; &lt;span class=&#34;dt&#34;&gt;R.HttpBody&lt;/span&gt; a &lt;span class=&#34;ot&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;dt&#34;&gt;R.Url&lt;/span&gt; &lt;span class=&#34;ch&#34;&gt;&#39;R.Https -&amp;gt; a -&amp;gt; Option -&amp;gt; Request&lt;/span&gt;
  &lt;span class=&#34;dt&#34;&gt;Post&lt;/span&gt;&lt;span class=&#34;ot&#34;&gt;   ::&lt;/span&gt; &lt;span class=&#34;dt&#34;&gt;R.HttpBody&lt;/span&gt; a &lt;span class=&#34;ot&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;dt&#34;&gt;R.Url&lt;/span&gt; &lt;span class=&#34;ch&#34;&gt;&#39;R.Https -&amp;gt; a -&amp;gt; Option -&amp;gt; Request&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The library throws exceptions on non-2XX response codes (eg 404). If this is not desired edit
&lt;a href=&#34;https://hackage.haskell.org/package/req-1.1.0/docs/Network-HTTP-Req.html#v:httpConfigCheckResponse&#34;&gt;httpConfigCheckResponse&lt;/a&gt; to something like:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34;&gt;&lt;pre class=&#34;sourceCode&#34;&gt;&lt;code class=&#34;sourceCode&#34;&gt;&lt;span class=&#34;kw&#34;&gt;instance&lt;/span&gt; &lt;span class=&#34;dt&#34;&gt;R.MonadHttp&lt;/span&gt; &lt;span class=&#34;dt&#34;&gt;MyCustomIOMonad&lt;/span&gt; &lt;span class=&#34;kw&#34;&gt;where&lt;/span&gt; &lt;span class=&#34;co&#34;&gt;-- or just IO&lt;/span&gt;
  &lt;span class=&#34;co&#34;&gt;-- :: R.MonadHttp m =&amp;gt; R.HttpException -&amp;gt; m a&lt;/span&gt;
  handleHttpException &lt;span class=&#34;fu&#34;&gt;=&lt;/span&gt; throwIO
  &lt;span class=&#34;co&#34;&gt;-- :: Req HttpConfig&lt;/span&gt;
  getHttpConfig &lt;span class=&#34;fu&#34;&gt;=&lt;/span&gt; pure &lt;span class=&#34;fu&#34;&gt;$&lt;/span&gt; def { R.httpConfigCheckResponse &lt;span class=&#34;fu&#34;&gt;=&lt;/span&gt; \_ _ _ &lt;span class=&#34;ot&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;dt&#34;&gt;Nothing&lt;/span&gt; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
</content><link xmlns:ns="http://www.w3.org/2005/Atom" ns:href="https://guide.aelve.com/haskell/http-clients-lohjgbh4#item-lk98x0le"/></entry></feed>