Essayer de recevoir la requête POST et le stocker dans la table ETSCowboy gestionnaire POST
voici le code
init(Req0, Opts) ->
Method = cowboy_req:method(Req0),
HasBody = cowboy_req:has_body(Req0),
Req = maybe_echo(Method, HasBody, Req0),
{ok, Req, Opts}.
maybe_echo(<<"POST">>, true, Req0) ->
{ok, PostVals, Req} = cowboy_req:read_urlencoded_body(Req0),
Echo = proplists:get_value(<<"echo">>, PostVals),
echo(Echo, Req);
maybe_echo(<<"POST">>, false, Req) ->
cowboy_req:reply(400, [], <<"Missing body.">>, Req);
maybe_echo(_, _, Req) ->
%% Method not allowed.
cowboy_req:reply(405, Req).
echo(undefined, Req) ->
cowboy_req:reply(400, [], <<"Missing echo parameter.">>, Req);
echo(Echo, Req) ->
Inf = #news{id=25, created=today, article=Echo},
case ets:insert(news, {Inf#news.id, Inf#news.created, Inf#news.article}) of
true -> cowboy_req:reply(200, #{<<"content-type">> => <<"text/plain; charset=utf-8">>}, Echo, Req);
_ ->
Error = <<"{\"error\": \"error\"}">>,
cowboy_req:reply(200, #{<<"content-type">> => <<"text/plain; charset=utf-8">>}, Error, Req)
end.
quand je recroqueville:
boucle $ -i -H « Content- Type: application/json "-X POST -d echo = '{" action ":" insérer "," clé ":" touche_quot "," valeur ": [1,2,3]}'
I Je reçois l'erreur:
= RAPPORT D'ERREUR ==== 29-Jan-2017 :: 18: 57: 21 === Ranch écouteur http, processus de connexion < 0.240.0>, le flux 1 a eu son processus de demande < 0.241.0> sortie avec raison badarg et stacktrace [{ets, insert, [news, {25, aujourd'hui, < < "{\" action \ ": \" insérer \ ", \" clé \ ": \" clé_unique \ ", \" valeur \ ": [1,2,3]}" >>}], []}, {post_handler, echo, 2, [{fichier, "e:/_ dev/nouvelles/_build/default/lib/nouvelles/src/post_handler.erl "}, {line, 25}]}, {post_handler, init, 2, [{fichier," e:/_ dev/nouvelles/_build/default/lib/nouvelles/src/post_handler.erl "}, { line, 8}], {cowboy_handler, execute, 2, [{fichier, "e:/_ dev/nouvelles/_build/default/lib/cowboy/src/cowboy_handler.erl"}, {ligne, 39}]}, {cowboy_stream_h, execute, 3, [{fichier, "e:/_ dev/nouvelles/_build/default/lib/cowboy/src/cowboy_stream_h.erl"}, {ligne, 173}]}, {cowboy_stream_h, proc_lib_hack, 3, [{fichier, "e:/_ dev/nouvelles/_build/default/lib/cowboy/src/cowboy_stream_ h.erl "}, {line, 158}]}, {proc_lib, init_p_do_apply, 3, [{fichier," proc_lib.erl "}, {ligne, 247}]}]
mais quand j'utilise l'écho comme ceci:
echo(Echo, Req) ->
cowboy_req:reply(200, #{<<"content-type">> => <<"text/plain; charset=utf-8">>}, Echo, Req)
end.
Je reçois la demande - ({ "action": "insérer", "clé": "some_key", "valeur": [1,2,3]})
si semble qu'il y a quelque chose avec ETS? mais je ne sais pas où je foiré
Création ets dans d'autres modules
ets: nouvelle (nouvelles, [ordered_set, protégées, named_table, {keypos, 1}, {read_concurrency, true}, {write_concurrency, true}])
pourriez-vous s'il vous plaît me montrer le droit dirrection pour résoudre ce problème
Comment/où créez-vous la table ETS? Etes-vous sûr que c'est un named_table et que le nom est news? – Dogbert
@Dogbert Je l'ai créé dans le module de démarrage comme ceci -record (news, {id, created, article}). Tab = ets: nouveau (news, [ordered_set, protected, named_table, {keypos, 1}, {read_concurrency, true}, {write_concurrency, true}]), {ok, Tab}. – Qbeck
@Qbeck, vous devriez le modifier dans la question. –