문제

내가 사용하여 얼랑 http:request 게시 데이터를 원격 서비스입니다.나는 게시물 작동하지만 본문에 데이터를()게시물의 통해 오로지 않고,어떤 url 을 인코딩하는 원인이 되는 게시물을 때 실패를 분석하여 원격 서비스입니다.

있는 기능에 얼랑 비슷한 CGI.탈 루비에서는 이러한 목적으?

도움이 되었습니까?

해결책

당신은 여기에서 찾을 수 있습니다 딸기 종 url_encode 및 url_decode 루틴

그들은 매우 간단하지만,의견을 나타내는 인코딩되지 100%완전한 모든 문자.

다른 팁

가 이 기능이 부족에 HTTP 모듈 뿐만 아니라.

이 기능은 실제로에서 사용할 수 있는 얼랑 배포,당신은 꼭보 하드에 충분하다.

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

이처럼 동작 CGI.에서 탈출 루비,또한 URI.탈출하는 동작이 약간 다르게:

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

edoc_lib

에서 적어도 R15 가 http_uri:인코딩/1 는 작업을 수행합니다.또한 사용을 권장하지 edoc_lib:escape_uri 로 번역하는'='하%3d 대신%3D 발생하는 나에게 어떤 문제입니다.

여기에 간단한 기능은 작업을 수행합니다.그것은 작동하도록 설계되었으로 직접 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"}])}
             ,[],[]).

응답 내 자신의 문제는...이 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 을 인코딩하는 문자열을 기반으로 RFC1738.목록을 반환합니다.

나는 사용할 수 있습이 인코딩을 수행 하고 아직도 사용하여 http:

만약 누군가가 필요 uri 를 인코딩과 함께 작동하는 utf-8 에 얼랑:

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: ƹÈ

여기"포크"의 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].

참고로,때문에 유니코드를 사용:characters_to_binary 야만 작품에서 R13 또는 새로운 있습니다.

AFAIK 없 URL 을 인코더에서는 표준 라이브러리입니다.Think I'빌리는'다음 코드에서 딸기 종 또는 어쩌면 하나의 얼랑 웹 서버:

% 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).
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top