Callbacks
Module
leptus_handler
NOTE: There are three callbacks which are required for every request
handler: init/3
, HttpMethod/3
and terminate/4
.
Types
Route = cowboy_router:route_match() Req = cowboy_req:req() State = any() json_term() = map() status_binding() = continue | switching_protocols | ok | created | accepted | non_authoritative_information | no_content | reset_content | partial_content | multiple_choices | moved_permanently | found | see_other | not_modified | use_proxy | switch_proxy | temporary_redirect | bad_request | unauthorized | payment_required | forbidden | not_found | not_allowed | not_acceptable | proxy_authentication_required | request_timeout | conflict | gone | length_required | precondition_failed | request_entity_too_large | request_uri_too_long | unsupported_media_type | requested_range_not_satisfiable | expectation_failed | internal_server_error | not_implemented | bad_gateway | service_unavailable | gateway_timeout | http_version_not_supported Status = non_neg_integer() | binary() | status_binding() Headers = map() Body = iodata() | json_term()
Callbacks
prefix/0
This is an optional callback which you can use for prefixing routes.
Module:prefix() -> string()
Example:
prefix() -> "/v1".
NOTE: this won't affect ~Route~s in the handler, but instead, this will be used when gathering routes and starting the Cowboy listener.
cross_domains/3
This is an optional callback that lets you enable cross-domain requests (CORS).
Module:cross_domains(Route, Req, State) -> {[HostMatch], State}
HostMatch
is equal to Cowboy HostMatch syntax.
This will be used when preparing headers right before replying.
If one of the HostMatches and the Origin match, access-control-allow-origin
will be set to the Origin.
is_authenticated/3
Exporting this callback in a module means that every request that should come to the handler needs authorization.
Module:is_authenticated(Route, Req, State) -> {true, State} | {false, Body, State} | {false, Headers, Body, State}
has_permission/3
This is an optional callback which lets you handle if a request has permission to proceed or not.
This callback will be called after Module:is_authenticated/3
if
authentication succeeds.
Module:has_permission(Route, Req, State) -> {true, State} | {false, Body, State} | {false, Headers, Body, State}
HttpMethod/3
This means get/3
, put/3
, post/3
, delete/3
.
Module:HttpMethod(Route, Req, State) -> {Body, State} | {Status, Body, State} | {Status, Headers, Body, State}
In this case, Route
must be a pattern that would match only a single string.
Example:
get("/", Req, State) -> ... {<<"index">>, State}. put("/:id/edit", Req, State) -> ... {20-0, <<"edited">>, State}. post("/new", Req, State) -> ... {201, [{<<"Location">>, <<"/data/38-6">>}], <<"created">>, State}. delete("/:id", Req, State) -> ... %% Body as a json {20-4, #{<<"message">> => <<"deleted">>}, State}.
Example
Please pay attention to comment.
-module(example). -compile({parse_transform, leptus_pt}). -export([prefix/0]). -export([init/3]). -export([cross_domains/3]). -export([is_authenticated/3]). -export([get/3]). -export([terminate/4]). prefix() -> "/example". init(_Route, _Req, State) -> {ok, State}. cross_domains(_Route, _Req, State) -> {['_'], State}. is_authenticated(_Route, _Req, State) -> {true, State}. %% Route is "/1" in every callback in this example, %% but we used prefix/0 to prefix "/1" by "/example", %% so get("/1") will be invoked by issuing the URL "/example/1" get("/1", _Req, State) -> {<<"Example 1!">>, State}. terminate(_Reason, _Route, _Req, _State) -> ok.