Argumentet til out/1 er en record der er defineret i yaws_api.hrl. yaws_api.hrl er automatisk inkluderet når en side evalueres, så man kan bruge den normale record-notation uden yderligere tiltag.
Følgende eksempel viser hvordan man kan hente docroot (Yaws-instancens docroot) og fullpath (stien til den ramte .yaws-fil) ud af argumentet
out(A) ->
{ehtml, [
{ul, [], [
{li, [], ["Doc Root: ", A#arg.docroot]},
{li, [], ["Full Path: ", A#arg.fullpath]}]
}]
}.
Argumentet til out/1 indeholder også en record der beskriver det indkomne request.
Følgende eksempel viser hvordan man kan hente method og path ud af argumentet
out(A) ->
Req = A#arg.req,
{_, Path} = Req#http_request.path,
Method = Req#http_request.method,
{ehtml, [
{ul, [], [
{li, [], f("Request Method: ~s", [Method])},
{li, [], f("Request Path: ~s", [Path])}]
}]
}.
Det er også muligt at hente headers fra argumentet. Følgende eksempel viser hvordan man kan hente headerne Accept og User-Agent
out(A) ->
H = A#arg.headers,
{ehtml, [
{ul, [], [
{li, [], f("Accept: ~s", [H#headers.accept])},
{li, [], f("User Agent: ~s", [H#headers.user_agent])}]
}]
}.
Og så er det naturligvis også muligt at forespørge på parametre fra query-delene af URL'en. Følgende eksempel viser hvordan man kan beregne BMI på baggrund af parametrene height og weigth
out(A) ->
Q = dict:from_list(yaws_api:parse_query(A)),
{H, _} = string:to_integer(dict:fetch("height", Q)),
{W, _} = string:to_integer(dict:fetch("weigth", Q)),
{ehtml, [
{h2, [], f("BMI: ~f", [W / math:pow(H / 100, 2)])}]
}.
Hvis filen (inkl. html) er gemt som query.yaws, så vil URL'en http://localhost:8000/query.yaws?height=183&weigth=99 vise en side med indholdet BMI: 29.561946. Hvem sagde fede! ;-)
I næste post vil jeg se lidt på Yaws applications - Yapps, så på snarligt gensyn :-)
1 kommentarer:
Hej Kim, hmmm er der ikke ret mange nestninger i koden? Fx der hvor du henter headern Accept og User-Agent? Det er de smarte Record's der gør trixet men er det ikke svært at overskue? Det ville være cool hvis du kunne vise det på en måde så man ikke skulle være verdensmester i yaml/json/erlang notation for at følge med.
Send en kommentar