HTTP Client Behaviour.
return() :: {:ok, %{status_code: integer(), body: any()}} | {:error, %{reason: any()}}
request( method :: atom(), url :: binary(), header :: [tuple()], body :: any(), opts :: keyword() ) :: return()