Програми для обліку

Українське програмне забезпечення з відкритим кодом

Erlang

Дописи

Програмування / Erlang

26.01.2024 18:32 Erlang

Erlang http клієнт. Http client (httpc)

Erlang Logo

Скрип для отримання даних з іншого локального вебсервера.

Erlang звертається до іншого локального вебсервера за даними.
Файл service.erl
Erlang
-module(service).

-export([
    about/3
]).

-define(WEBHOST, "http://localhost:8082/").

about(SessionID, Env, _Input) ->
    get_request(SessionID, Env, "about", "text/html").

% Вибірка даних метод GET
get_request(SessionID, Env, Service, ContentType) ->
    check_allow_host(Env),
    QueryString = query_string(Env),
    PathInfo = path_info(Env),
    Request = {?WEBHOST ++ Service ++ QueryString ++ PathInfo, []},
    {R, Result} = httpc:request(get, Request, [], []),
    if
        R =:= ok ->
            {{_Protocol, Code, _Info}, _Headers, Body} = Result,
            if
                Code =:= 200 ->
                    mod_esi:deliver(SessionID, [
                        "Content-Type:" ++ ContentType, "\r\n\r\n", io_lib:format("~s~n", [Body])
                    ]);
                true ->
                    % У всіх інших випадках на початкову сторінку
                    mod_esi:deliver(SessionID, ["Location: /", "\r\n\r\n"])
            end;
        true ->
            % У випадку помилки перенаправити на сторінку що сервіс тимчасово не працює
            mod_esi:deliver(SessionID, ["Location: /", "\r\n\r\n"])
    end.

% Відправлення даних методом POST
post_request(SessionID, Env, Service, ContentType, Input) ->
    check_allow_host(Env),
    Request = {?WEBHOST ++ Service, [], "application/x-www-form-urlencoded", Input},
    {R, Result} = httpc:request(post, Request, [], []),
    if
        R =:= ok ->
            {{_Protocol, Code, _Info}, _Headers, Body} = Result,
            if
                Code =:= 200 ->
                    mod_esi:deliver(SessionID, [
                        "Content-Type:" ++ ContentType, "\r\n\r\n", io_lib:format("~s~n", [Body])
                    ]);
                true ->
                    % У всіх інших випадках на початкову сторінку
                    mod_esi:deliver(SessionID, ["Location: /", "\r\n\r\n"])
            end;
        true ->
            % У випадку помилки перенаправити на сторінку що сервіс тимчасово не працює
            mod_esi:deliver(SessionID, ["Location: /", "\r\n\r\n"])
    end.

path_info([]) ->
    "";
path_info([{Key, Value} | Env]) ->
    if
        Key =:= 'path_info' ->
            "/" ++ Value;
        true ->
            path_info(Env)
    end.

query_string([]) ->
    "";
query_string([{Key, Value} | Env]) ->
    if
        Key =:= 'query_string' ->
            "?" ++ Value;
        true ->
            query_string(Env)
    end.

© accounting.org.ua - 2024