Regular Requests
Once the application is started a connection needs to be created in order to start making requests:
{ok, Conn} = shotgun:open("google.com", 80),
{ok, Response} = shotgun:get(Conn, "/"),
io:format("~p~n", [Response]),
shotgun:close(Conn).
Which results in:
#{body => <<"<HTML><HEAD>"...>>,
headers => [
{<<"location">>,<<"http://www.google.com/adfs">>},
{<<"content-type">>,<<"text/html; charset=UTF-8">>},
{<<"x-content-type-options">>,<<"nosniff">>},
{<<"date">>,<<"Fri, 17 Oct 2014 17:18:32 GMT">>},
{<<"expires">>,<<"Sun, 16 Nov 2014 17:18:32 GMT">>},
{<<"cache-control">>,<<"public, max-age=2592000">>},
{<<"server">>,<<"sffe">>},
{<<"content-length">>,<<"223">>},
{<<"x-xss-protection">>,<<"1; mode=block">>},
{<<"alternate-protocol">>,<<"80:quic,p=0.01">>}
],
status_code => 302}
}
%= ok
Immediately after opening a connection we did a GET request, where we didn’t
specify any headers or options. Every HTTP method has its own shotgun
function that takes a connection, a uri (which needs to include the slash),
a headers map or a proplist containing the headers, and an options map.
Some of the functions (post/5
, put/5
and patch/5
) also take a body
argument.
Alternatively there’s a generic request/6
function in which the user can
specify the HTTP method as an argument in the form of an atom: get
, head
,
options
, delete
, post
, put
or patch
.
IMPORTANT: When you are done using the shotgun connection remember to close
it with shotgun:close/1
.
HTTP Secure Requests
It is possible to tell shotgun to use SSL by providing the atom https
as the
third argument when creating a connection with to the open
function. Just
like when performing HTTP requests it is also necessary to specify
a port. HTTPS servers typically listen for connections on port 443 and this
will be the most likely value you’ll need to use.
Basic Authentication
If you need to provide basic authentication credentials in your requests, it is
as easy as specifying a basic_auth
entry in the headers map:
{ok, Conn} = shotgun:open("site.com", 80),
{ok, Response} = shotgun:get(Conn, "/user", #{basic_auth => {"user", "password"}}),
, or
{ok, Response} = shotgun:get(Conn, "/user", [{basic_auth, {"user", "password"}}]),
shotgun:close(Conn).
Specifying a Timeout
The timeout
option can be used to specify a value for all types of requests:
{ok, Conn} = shotgun:open("google.com", 80).
{error, Error} = shotgun:get(Conn, "/", #{}, #{timeout => 10}).
io:format("~p~n", [Error]).
%%= {timeout,{gen_fsm,sync_send_event,[<0.368.0>,{get,{"/",[],[]}},10]}}
shotgun:close(Conn).
The default timeout
value is 5000 if none is specified.
Building & Test-Driving
To build shotgun just run the following on your command shell:
rebar3 compile
To start up a shell where you can try things out run the following (after building the project as described above):
rebar3 shell