Erlang读post请求

Erlang读post请求,erlang,erlangweb,Erlang,Erlangweb,我正在尝试基于Erlang构建一个简单的web服务器,到目前为止,我能够用以下代码启动一个服务器 -模块(helloworld)。 -出口([ main/1, 运行\u服务器/0, 开始/0, 服务/3, ]). main(u41;)-> start(), 接收 停止->确定 结束。 运行\u服务器()-> ok=inets:start(), {ok,{}=inets:start(httpd[ {模,[ mod_别名, mod_auth, 摩登, 现代行动, mod_cgi, 国防部长, 莫得,

我正在尝试基于Erlang构建一个简单的web服务器,到目前为止,我能够用以下代码启动一个服务器

-模块(helloworld)。
-出口([
main/1,
运行\u服务器/0,
开始/0,
服务/3,
]).
main(u41;)->
start(),
接收
停止->确定
结束。
运行\u服务器()->
ok=inets:start(),
{ok,{}=inets:start(httpd[
{模,[
mod_别名,
mod_auth,
摩登,
现代行动,
mod_cgi,
国防部长,
莫得,
莫德乌头,
模型日志,
mod_磁盘_日志
]}, 
{港口,8000},
{服务器名称,“helloworld”},
{server_root,“/tmp”},
{document_root,“.”},
{erl_script_别名,{“/erl”,[helloworld]},
{error_log,“error.log”},
{security_log,“security.log”},
{transfer_log,“transfer.log”},
{mime_类型,[
{“html”、“text/html”}、{“css”、“text/css”}、{“js”、“application/x-javascript”}]}
]). 
开始()->运行服务器()。
服务(SessionID,_Env,_Input)->mod_esi:deliver(SessionID,[
“内容类型:text/html\r\n\r\n”“你好,世界!”])。
我正在尝试获取响应,但获取权限错误

您没有访问此服务器上的/erl/hello\u world:service的权限

我的目标是构建基于Erlang的服务器,它可以读取post请求并将post数据存储在MYSQL中

如果有人能帮我提供一些说明或代码来启动Erlang服务器来读取POST请求,这将非常有帮助


谢谢

您正在调用inets:start/0和inets:start/2,在本例中,这只是一个或另一个,不知道这是否会产生影响

我的目标是构建基于Erlang的服务器,它可以读取post请求 并将post数据存储在MYSQL中

我曾经创建过一个应用程序:

$ rebar3 new app myserver
然后我将其指定为依赖项,以便可以使用mysql。我基本上忽略了OTP应用程序,并添加了一些源代码来启动iNet服务器。看

下面是我用来启动inets httpd服务器、处理请求并将post数据插入mysql数据库的模块:

my.erl

-module(my).
-compile(export_all).

ensure_inets_start() ->
    case inets:start() of
        ok -> ok;
        {error,{already_started,inets}} -> ok
    end.

start() ->
    ok = my:ensure_inets_start(),

    %Construct path to myserver/priv/server.conf:
    PrivDir = code:priv_dir(myserver),
    ServerConfPath = filename:join(PrivDir, "server.conf"),

    {ok, Server} = inets:start(httpd, 
        [{proplist_file, ServerConfPath}]
    ),
    Server.


stop(Server) ->
    ok = inets:stop(httpd, Server).

log(Data) ->
    {ok, IoDevice} = file:open(
        %"/Users/7stud/erlang_programs/inets_post_request/myserver/logs/mylog.log",
        "./logs/mylog.log",
        [append]
    ),

    file:write(IoDevice, Data),
    file:close(IoDevice).

handle_request(SessionID, Env, Input) ->
    Headers = "Content-Type: text/html\r\n\r\n",
    Data = [
        <<"Hello, ">>, 
        "esi!\n"
    ],

    log(io_lib:format(
        "Inside my:handle_request()\nSessionId=~p\nEnv=~p\nInput=~p\n", 
        [SessionID, Env, Input]
    )),

    PostData = list_to_binary(Input),
    [NamePair, InfoPair] = binary:split(PostData, <<"&">>),
    [<<"name">>, Name] = binary:split(NamePair, <<"=">>),
    [<<"info">>, Info] = binary:split(InfoPair, <<"=">>),
    do_mysql(Name, Info),

    mod_esi:deliver(SessionID, Headers),  %Headers must be a string.
    mod_esi:deliver(SessionID, Data).     %Data can be an iolist.

do_mysql(Name, Info) ->
    {ok, MysqlPid} = mysql:start_link(
                  [{host, "localhost"}, 
                   {user, "root"},
                   {password, ""}, 
                   {database, "mydb"}
                  ]
                ),

    %{ok, ColumnNames, Rows} = mysql:query(
    %            Pid, 
    %            <<"SELECT * FROM people">>),
    %io:format("ColumnNames: ~p~nRows: ~p~n", [ColumnNames, Rows]).

    ok = mysql:query(
           MysqlPid, 
           "INSERT INTO people (name, info) VALUES (?, ?)", [Name, Info]
        ).
以下是
server.conf
文件:

[
  {modules, [
    mod_alias,
    mod_actions,
    mod_esi,
    mod_cgi,
    mod_get,
    mod_log
  ]},
  {bind_address, "localhost"}, 
  {port,0},
  {server_name,"httpd_test"},
  {server_root,"./"},
  {document_root,"./htdocs"},
  {erl_script_alias, {"/erl", [my]} },
  {erl_script_nocache, true},
  {error_log, "./logs/errors.log"},
  {transfer_log, "./logs/requests.log"}
].
{erl_opts, [debug_info]}.
{deps, [
  {mysql, {git, "https://github.com/mysql-otp/mysql-otp",
          {tag, "1.3.2"}}}
]}.
然后,要运行该应用程序,我执行了以下操作:

~/erlang_programs/inets_post_request/myserver$ rebar3 compile (may not be necessary)
...
...
~/erlang_programs/inets_post_request/myserver$ rebar3 shell (looks like this also will fetch the dependencies, then compile)
===> Verifying dependencies...
===> Compiling myserver
/Users/7stud/erlang_programs/inets_post_request/myserver/_build/default/lib/myserver/src/my.erl:2: Warning: export_all flag enabled - all functions will be exported

Erlang/OTP 20 [erts-9.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V9.2  (abort with ^G)
1> S = my:start().
<0.127.0>

2> httpd:info(S). 
[{mime_types,[{"htm","text/html"},{"html","text/html"}]},
 {server_name,"httpd_test"},
 {erl_script_nocache,true},
 {bind_address,{127,0,0,1}},
 {modules,[mod_alias,mod_actions,mod_esi,mod_cgi,mod_get,
           mod_log]},
 {server_root,"/Users/7stud/erlang_programs/inets_post_request/myserver/src"},
 {erl_script_alias,{"/erl",[my]}},
 {port,55804},
 {transfer_log,<0.134.0>},
 {error_log,<0.133.0>},
 {document_root,"./htdocs"}]

3>
然后我停止了inets httpd服务器:

4> my:stop(S).
ok

5> 
然后我检查了mysql数据库中的一个新条目:

mysql> select * from people;
+----+-------+------+
| id | name  | info |
+----+-------+------+
|  1 | Fred  | abc  |
|  2 | Alice | xxx  |
|  3 | Kathy | xyz  |
+----+-------+------+
4 rows in set (0.00 sec)
成功

这是我的
rebar.config
文件:

[
  {modules, [
    mod_alias,
    mod_actions,
    mod_esi,
    mod_cgi,
    mod_get,
    mod_log
  ]},
  {bind_address, "localhost"}, 
  {port,0},
  {server_name,"httpd_test"},
  {server_root,"./"},
  {document_root,"./htdocs"},
  {erl_script_alias, {"/erl", [my]} },
  {erl_script_nocache, true},
  {error_log, "./logs/errors.log"},
  {transfer_log, "./logs/requests.log"}
].
{erl_opts, [debug_info]}.
{deps, [
  {mysql, {git, "https://github.com/mysql-otp/mysql-otp",
          {tag, "1.3.2"}}}
]}.

我刚刚完成了所有的
inets
工作。以下是我的几篇帖子,有答案:
cgi/json
:,
esi
{erl_opts, [debug_info]}.
{deps, [
  {mysql, {git, "https://github.com/mysql-otp/mysql-otp",
          {tag, "1.3.2"}}}
]}.