URL-адрес в Erlang

http url encoding erlang

12648 просмотра

8 ответа

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

Есть ли функция в Erlang, похожая на CGI.escape в Ruby для этой цели?

Автор: davidsmalley Источник Размещён: 17.05.2019 03:48

Ответы (8)


8 плюса

Решение

Вы можете найти здесь процедуры YAWS url_encode и url_decode

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

Автор: Bwooce Размещён: 23.09.2008 07:17

24 плюса

Я также обнаружил отсутствие этой функции в модулях 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

Автор: klaar Размещён: 01.02.2009 05:49

8 плюса

По крайней мере, в R15 есть http_uri: encode / 1, который выполняет задание. Я бы также не рекомендовал использовать edoc_lib: escape_uri как его перевод «=» в% 3d вместо% 3D, что вызвало у меня некоторые проблемы.

Автор: John-Paul Bader Размещён: 27.04.2012 02:26

5 плюса

Вот простая функция, которая выполняет эту работу. Он предназначен для работы непосредственно с inets httpc.

%% @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"}])}
             ,[],[]).
Автор: Rick Moynihan Размещён: 17.08.2010 04:16

4 плюса

Чтобы ответить на мой вопрос ... Я нашел эту библиотеку в 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:

Автор: davidsmalley Размещён: 22.09.2008 11:07

2 плюса

Если кому-то нужно кодировать uri, который работает с utf-8 в erlang:

https://gist.github.com/3796470

Ex.

Eshell V5.9.1  (abort with ^G)

1> c(encode_uri_rfc3986).
{ok,encode_uri_rfc3986}

2> encode_uri_rfc3986:encode("テスト").
"%e3%83%86%e3%82%b9%e3%83%88"

3> edoc_lib:escape_uri("テスト").
"%c3%86%c2%b9%c3%88" # output wrong: ƹÈ
Автор: Renato Albano Размещён: 28.09.2012 11:15

1 плюс

Вот «вилка» функции edoc_lib: escape_uri, которая улучшает поддержку UTF-8, а также поддерживает двоичные файлы.

escape_uri(S) when is_list(S) ->
    escape_uri(unicode:characters_to_binary(S));
escape_uri(<<C:8, Cs/binary>>) when C >= $a, C =< $z ->
    [C] ++ escape_uri(Cs);
escape_uri(<<C:8, Cs/binary>>) when C >= $A, C =< $Z ->
    [C] ++ escape_uri(Cs);
escape_uri(<<C:8, Cs/binary>>) when C >= $0, C =< $9 ->
    [C] ++ escape_uri(Cs);
escape_uri(<<C:8, Cs/binary>>) when C == $. ->
    [C] ++ escape_uri(Cs);
escape_uri(<<C:8, Cs/binary>>) when C == $- ->
    [C] ++ escape_uri(Cs);
escape_uri(<<C:8, Cs/binary>>) when C == $_ ->
    [C] ++ escape_uri(Cs);
escape_uri(<<C:8, Cs/binary>>) ->
    escape_byte(C) ++ escape_uri(Cs);
escape_uri(<<>>) ->
    "".

escape_byte(C) ->
    "%" ++ hex_octet(C).

hex_octet(N) when N =< 9 ->
    [$0 + N];
hex_octet(N) when N > 15 ->
    hex_octet(N bsr 4) ++ hex_octet(N band 15);
hex_octet(N) ->
    [N - 10 + $a].

Обратите внимание, что из-за использования unicode: characters_to_binary он будет работать только в R13 или новее.

Автор: gdamjan Размещён: 18.09.2010 08:11

0 плюса

AFAIK нет кодеков URL в стандартных библиотеках. Думаю, что я «заимствовал» следующий код от YAWS или, возможно, один из других веб-серверов 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).
Автор: tonys Размещён: 22.09.2008 10:54
Вопросы из категории :
32x32