[erlang-questions] Posting HTTP Form Data with Erlang

89 views
Skip to first unread message

Rick Moynihan

unread,
Aug 17, 2010, 11:43:51 AM8/17/10
to erlang-q...@erlang.org
Does anyone know if there is an API that I can use to post HTTP form data?

I've looked at using inets:httpc, and it seems to have everything I
need, except that it doesn't appear to allow you to pass it a list of
key/value tuples and have them be encoded into the HTTP request as
application/x-www-form-urlencoded data.

Does anyone know if inets:httpc can do this, and if not whether there
are any libraries I can easily use?

Cheers,

R.

________________________________________________________________
erlang-questions (at) erlang.org mailing list.
See http://www.erlang.org/faq.html
To unsubscribe; mailto:erlang-questio...@erlang.org

Robert Raschke

unread,
Aug 17, 2010, 12:46:35 PM8/17/10
to Rick Moynihan, erlang-q...@erlang.org
On Tue, Aug 17, 2010 at 4:43 PM, Rick Moynihan <ri...@wgrids.com> wrote:

> Does anyone know if there is an API that I can use to post HTTP form data?
>
> I've looked at using inets:httpc, and it seems to have everything I
> need, except that it doesn't appear to allow you to pass it a list of
> key/value tuples and have them be encoded into the HTTP request as
> application/x-www-form-urlencoded data.
>
> Does anyone know if inets:httpc can do this, and if not whether there
> are any libraries I can easily use?
>
>

Mochiweb provides a Request "object" to your callback function, and that has
a parse_post/0 function, which'll give you back a proplist of key/value
pairs from your POST body (and you can use parse_qs/0 for GET options after
the ? on the url).

Haven't used inets in a while.

Robby

Tino Breddin

unread,
Aug 18, 2010, 2:11:07 AM8/18/10
to Robert Raschke, Rick Moynihan, erlang-q...@erlang.org
Something like the following might work for you as well:

httpc:request(post, {Url, [], "application/x-www-form-urlencoded, "key=value&key2=value2}, [], []).

If required you could use edoc:escape_uri(String) for the individual values.

Be sure to start inets before using httpc.

Tino

Rick Moynihan

unread,
Aug 18, 2010, 4:44:40 AM8/18/10
to Tino Breddin, Robert Raschke, erlang-q...@erlang.org
On Wed, Aug 18, 2010 at 7:11 AM, Tino Breddin
<tino.b...@googlemail.com> wrote:
> Something like the following might work for you as well:
>
> httpc:request(post, {Url, [], "application/x-www-form-urlencoded, "key=value&key2=value2}, [], []).
>
> If required you could use edoc:escape_uri(String) for the individual values.

Yes, I discovered that shortly after sending the email; prompting me
to write the following function, rather than take on an external
dependency, which I'm a little loathed to do for something so small:

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)).

Thanks to everyone for your help,

R.

Tim Fletcher

unread,
Aug 18, 2010, 8:06:42 AM8/18/10
to erlang-q...@erlang.org
> httpc:request(post, {Url, [], "application/x-www-form-urlencoded, "key=value&key2=value2}, [], []).
>
> If required you could use edoc:escape_uri(String) for the individual values.

URI escaping and application/x-www-form-urlencoded escaping are not
exactly the same thing though.

There's an implementation of both here:

http://github.com/tim/erlang-percent-encoding

I'd appreciate any feedback on the correctness of the code/tests.

> Yes, I discovered that shortly after sending the email; prompting me
> to write the following function, rather than take on an external
> dependency, which I'm a little loathed to do for something so small:

Agreed. I usually copy/paste bits into other projects, for example:

http://github.com/tim/erlang-webfinger/blob/master/src/webfinger.erl#L65-82

Cheers,
Tim

Reply all
Reply to author
Forward
0 new messages