檢視原始碼 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