我开发了这个功能:
sms_sentByHttp(NumPhone,MsgReceived) ->
NumPhoneTroncated = string:sub_string(NumPhone,2),
{X1, X2, X3} = erlang:now(),
Rand = random:uniform(9999),
{{Y,M,D},{H,Mn,S}}=erlang:universaltime(),
Ws_req_id = lists:flatten(io_lib:format("~p~p~p~p~p~p~p~p", [X3, Rand,Y,M,D,H,M,S])),
Url = io_lib:format("http://localhost:7703/enda?msg=~s&from=~s&id=~s", [http_urii:encode(MsgReceived),http_urii:encode(NumPhoneTroncated),Ws_req_id]),
case http:request(lists:flatten(Url)) of
{ok , A} -> io:format("response sent\n");
{error, B} -> io:format("response not sent\n ~w\n", [B])
end.
现在我想在请求中添加超时概念,例如20秒后。我想显示来自服务器的错误
我尝试过:
case http:request(lists:flatten(Url),[ {timeout,timer:seconds(20)}]) of
{ok , A} -> io:format("response sent\n");
{error, B} -> io:format("error from server\n ~w\n", [B])
end.
答案 0 :(得分:3)
我建议使用ibrowse作为您的HTTP客户端。它包含send_req / 6中的超时参数(以及更精细调整超时的选项)。它通常比默认包含的inets库更有效。
另一个选项是lhttpc,但显然使用了一个环境变量用于超时,如果您需要更改某些请求的超时,这将是一个问题。
编辑:
httpc:request/4允许您指定超时作为HTTPOptions的一部分,例如:
httpc:request(get, {URL, []}, [{timeout, timer:seconds(20)}], []).