檢視原始碼 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.dev.org.tw", []}, [], []).

在呈現所有預設值的情況下,也可以將 get 請求寫成如下形式

4> {ok, {{Version, 200, ReasonPhrase}, Headers, Body}} =
.. httpc:request("https://erlang.dev.org.tw").

以下是一個 https 請求,並驗證主機

5> {ok, {{Version, 200, ReasonPhrase}, Headers, Body}} =
.. httpc:request(get, {"https://erlang.dev.org.tw", []}, [{ssl, httpc:ssl_verify_host_options(true)}], []).

以下是一個普通的非同步請求

6> {ok, RequestId} =
.. httpc:request(get, {"https://erlang.dev.org.tw", []}, [], [{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.dev.org.tw", [{"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.dev.org.tw", foo).
{error, econnrefused}

停止 HTTP 客戶端設定檔

12> inets:stop(httpc, foo).
ok

停止 HTTP 客戶端設定檔的另一種方式

13> inets:stop(httpc, Pid).
ok