1

webmachine プロジェクトでは、他のサーバーからの https ページも要求しています。

プロトタイプでは、次の方法でそれを行うことができました。

to_html(ReqData, State) ->
    OtherResource = "https://example.com",
    inets:start(),
    ssl:start(),
    {ok, {{Version, 200, ReasonPhrase}, Headers, Body}} =
      httpc:request(get, {OtherResource, []}, [], []), 
    %% building the HTML response here...
    {HTML, ReqData, State}.

これはプロトタイプとして機能しますが、今では inets と ssl をどこでどのように開始し、適切な方法で実行し続けるのか疑問に思っています。

src/myapp.erl にも開始された inets があることを確認しましたが、この inets インスタンスは上記のページ レンダリングでは使用できませんでした。

start() ->
    ensure_started(inets), 
4

1 に答える 1

2

標準の起動スクリプトの一部として inets および ssl アプリケーションを起動できます (または、使用しているものは何でも - そのために reltool を使用する可能性があります)。また、リクエストの実行中に何らかの状態が必要な場合 (webmachine からの状態)、init/1 関数の一部として必要なものを開始できます (また、リクエストの最後で停止したい場合は、 finish_request/2 内で任意の停止手順を呼び出すことができます - 「この関数は、エクスポートされた場合、最終的な応答が構築されて送信される直前に呼び出されます。結果は無視されるため、この関数の効果は、変更された ReqData を返すことによるものでなければなりません。」) :

以下は、reltool.config の抜粋です。

{sys, [
       {lib_dirs, []},
       {erts, [{mod_cond, derived}, {app_file, strip}]},
       {app_file, strip},
       {rel, "myapp", "1",
        [
         kernel,
         stdlib,
         sasl,
         myapp
        ]},
       {rel, "start_clean", "",
        [
         kernel,
         stdlib
        ]},
       {boot_rel, "myapp"},
       {profile, embedded},
       {incl_cond, exclude},
       {excl_archive_filters, [".*"]}, %% Do not archive built libs
       {excl_sys_filters, ["^bin/.*", "^erts.*/bin/(dialyzer|typer)",
                           "^erts.*/(doc|info|include|lib|man|src)"]},
       {excl_app_filters, ["\.gitignore"]},
       {app, sasl,   [{incl_cond, include}]},
       {app, stdlib, [{incl_cond, include}]},
       {app, kernel, [{incl_cond, include}]},
       {app, mnesia, [{incl_cond, include}]},
       {app, inets, [{incl_cond, include}]}
      ]}.

inets ({app, inets, [{incl_cond, include}]} ) と同じように、ssl の別のエントリを追加できます。通常、rebar を使用して、必要なすべてのスケルトン ファイルを生成できます。

于 2012-07-11T18:09:19.220 に答える