Erlang读post请求
我正在尝试基于Erlang构建一个简单的web服务器,到目前为止,我能够用以下代码启动一个服务器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, 国防部长, 莫得,
-模块(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"}}}
]}.