查看源代码 HTTP 客户端
配置
当 Inets
应用程序启动时,HTTP 客户端默认配置文件也会启动,然后该配置文件可供该 Erlang 节点上的所有进程使用。其他配置文件也可以在应用程序启动时启动,或者配置文件可以在运行时动态启动和停止。每个客户端配置文件都会生成一个新进程来处理每个请求,除非可以使用带有或不带有流水线的持久连接。如果请求中没有 host
标头和空的 te
标头,则客户端会添加这些标头。
只要底层机制也支持,客户端就支持 IPv6。
以下内容需要放入 Erlang 节点应用程序配置文件中,以便在应用程序启动时启动一个配置文件
[{inets, [{services, [{httpc, PropertyList}]}]}]
有关有效的属性,请参阅 httpc
。
入门
启动 Inets
1> inets:start().
ok
以下调用使用默认的客户端配置文件。除了对 localhost 的请求外,使用代理 "www-proxy.mycompany.com:8000"
。这适用于以下所有请求。
示例
2> httpc:set_options([{proxy, {{"www-proxy.mycompany.com", 8000},
["localhost"]}}]).
ok
以下是一个普通的同步请求
3> {ok, {{Version, 200, ReasonPhrase}, Headers, Body}} =
.. httpc:request(get, {"https://erlang.org.cn", []}, [], []).
使用所有默认值,也可以将 get 请求编写如下
4> {ok, {{Version, 200, ReasonPhrase}, Headers, Body}} =
.. httpc:request("https://erlang.org.cn").
以下是一个 https 请求,并对主机进行验证
5> {ok, {{Version, 200, ReasonPhrase}, Headers, Body}} =
.. httpc:request(get, {"https://erlang.org.cn", []}, [{ssl, httpc:ssl_verify_host_options(true)}], []).
以下是一个普通的异步请求
6> {ok, RequestId} =
.. httpc:request(get, {"https://erlang.org.cn", []}, [], [{sync, false}]).
结果以 {http, {ReqestId, Result}}
的形式发送到调用进程。
在这种情况下,调用进程是 shell,因此会收到以下结果
7> receive {http, {RequestId, Result}} -> ok after 500 -> error end.
ok
这会发送一个带有指定连接标头的请求
8> {ok, {{NewVersion, 200, NewReasonPhrase}, NewHeaders, NewBody}} =
.. httpc:request(get, {"https://erlang.org.cn", [{"connection", "close"}]},
.. [], []).
这会通过 Unix 域套接字发送 HTTP 请求(实验性)
9> httpc:set_options([{ipfamily, local}, {unix_socket,"/tmp/unix_socket/consul_http.sock"}]).
10> {ok, {{NewVersion, 200, NewReasonPhrase}, NewHeaders, NewBody}} =
.. httpc:request(put, {"http:///v1/kv/foo", [], [], "hello"}, [], []).
启动一个 HTTP 客户端配置文件
10> {ok, Pid} = inets:start(httpc, [{profile, foo}]).
{ok, <0.45.0>}
新的配置文件没有代理设置,因此连接被拒绝
11> httpc:request("https://erlang.org.cn", foo).
{error, econnrefused}
停止 HTTP 客户端配置文件
12> inets:stop(httpc, foo).
ok
停止 HTTP 客户端配置文件的另一种方法
13> inets:stop(httpc, Pid).
ok