查看源代码 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