URL кодирует в Erlang

Я использую erlang http:request для регистрации некоторых данных на удаленный сервис. У меня есть работа сообщения, но данные в теле () сообщения проникают, как, без любого кодирования URL, которое заставляет сообщение перестать работать при парсинге удаленным сервисом.

Существует ли функция в Erlang, который подобен CGI.escape в Ruby с этой целью?

20
задан polareper 10 November 2019 в 20:00
поделиться

5 ответов

Можно найти здесь ОТКЛОНЕНИЯ ОТ КУРСА url_encode и url_decode стандартные программы

, Они довольно просты, хотя комментарии указывают, что кодировать не на 100% завершено для всех знаков пунктуации.

9
ответ дан 29 November 2019 в 22:58
поделиться

Я столкнулся с отсутствием этой функции в модулях HTTP.

Оказывается, что эта функциональность на самом деле доступна в дистрибутиве Erlang, вы просто должны выглядеть достаточно усердно.

> edoc_lib:escape_uri("luca+more@here.com").
"luca%2bmore%40here.com"

Это ведет себя как CGI.escape в Ruby, есть также URI.escape, который ведет себя немного по-другому:

> CGI.escape("luca+more@here.com")
 => "luca%2Bmore%40here.com" 
> URI.escape("luca+more@here.com")
 => "luca+more@here.com" 

edoc_lib

23
ответ дан 29 November 2019 в 22:58
поделиться

Вот простая функция, которая делает эту работу. Он предназначен для работы напрямую с http-инетами.

%% @doc A function to URL encode form data.
%% @spec url_encode(formdata()).

-spec(url_encode(formdata()) -> string()).
url_encode(Data) ->
    url_encode(Data,"").

url_encode([],Acc) ->
    Acc;

url_encode([{Key,Value}|R],"") ->
    url_encode(R, edoc_lib:escape_uri(Key) ++ "=" ++ edoc_lib:escape_uri(Value));
url_encode([{Key,Value}|R],Acc) ->
    url_encode(R, Acc ++ "&" ++ edoc_lib:escape_uri(Key) ++ "=" ++ edoc_lib:escape_uri(Value)).

Пример использования:

httpc:request(post, {"http://localhost:3000/foo", [], 
                    "application/x-www-form-urlencoded",
                    url_encode([{"username", "bob"}, {"password", "123456"}])}
             ,[],[]).
7
ответ дан 29 November 2019 в 22:58
поделиться

Отвечать на мой собственный вопрос... Я нашел этот lib в ibrowse!

http://www.erlware.org/lib/5.6.3/ibrowse-1.4/ibrowse_lib.html#url_encode-1

url_encode/1

url_encode(Str) -> UrlEncodedStr

Str = string()
UrlEncodedStr = string()

URL - кодирует строку на основе RFC 1738. Возвращает плоский список.

я предполагаю, что могу использовать это, чтобы сделать кодирование и все еще использовать http:

4
ответ дан 29 November 2019 в 22:58
поделиться

AFAIK там не является никаким кодером URL в стандартных библиотеках. Думайте, что я 'одолжил' следующий код у ОТКЛОНЕНИЙ ОТ КУРСА или возможно одного из других веб-серверов Erlang:

% Utility function to convert a 'form' of name-value pairs into a URL encoded
% content string.

urlencode(Form) ->
    RevPairs = lists:foldl(fun({K,V},Acc) -> [[quote_plus(K),$=,quote_plus(V)] | Acc] end, [],Form),
    lists:flatten(revjoin(RevPairs,$&,[])).

quote_plus(Atom) when is_atom(Atom) ->
    quote_plus(atom_to_list(Atom));

quote_plus(Int) when is_integer(Int) ->
    quote_plus(integer_to_list(Int));

quote_plus(String) ->
    quote_plus(String, []).

quote_plus([], Acc) ->
    lists:reverse(Acc);

quote_plus([C | Rest], Acc) when ?QS_SAFE(C) ->
    quote_plus(Rest, [C | Acc]);

quote_plus([$\s | Rest], Acc) ->
    quote_plus(Rest, [$+ | Acc]);

quote_plus([C | Rest], Acc) ->
    <<Hi:4, Lo:4>> = <<C>>,
    quote_plus(Rest, [hexdigit(Lo), hexdigit(Hi), ?PERCENT | Acc]).

revjoin([], _Separator, Acc) ->
    Acc;

revjoin([S | Rest],Separator,[]) ->
    revjoin(Rest,Separator,[S]);

revjoin([S | Rest],Separator,Acc) ->
    revjoin(Rest,Separator,[S,Separator | Acc]).

hexdigit(C) when C < 10 -> $0 + C;
hexdigit(C) when C < 16 -> $A + (C - 10).
0
ответ дан 29 November 2019 в 22:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: