在一个网络机器项目中,我还从其他服务器请求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),
您可以将inets和ssl应用程序作为标准启动脚本的一部分启动(或者您正在使用的任何东西,因为您可能会使用reltool)。此外,如果您在请求期间需要一些状态(来自网络机器的状态),作为init/1函数的一部分,你可以启动任何你想要的东西(如果你想在请求结束时停止它,你可以调用finish_request/2中的任何停止过程——"如果导出了这个函数,它会在构建和发送最终响应之前被调用。Result被忽略,所以这个函数的任何效果都必须通过返回修改后的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}]}
]}.
您可以为ssl添加另一个条目,与inets({app,inets,〔{incl_cd,include}〕})相同。通常,可以使用钢筋生成所需的所有骨架文件。