How do you URL encode parameters in Erlang?

前端 未结 8 1119
清歌不尽
清歌不尽 2020-12-31 01:17

I\'m using httpc:request to post some data to a remote service. I have the post working but the data in the body() of the post comes through as is, without any URL-encoding

8条回答
  •  轮回少年
    2020-12-31 01:44

    AFAIK there's no URL encoder in the standard libraries. Think I 'borrowed' the following code from YAWS or maybe one of the other Erlang web servers:

    % 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) ->
        <> = <>,
        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).
    

提交回复
热议问题