【问题标题】:How to set body to Cowboy POST response如何将正文设置为 Cowboy POST 响应
【发布时间】:2021-01-05 02:29:13
【问题描述】:

我有简单的牛仔休息处理程序:

-module(request_handler).
-export([
  init/2,
  allowed_methods/2,
  content_types_accepted/2,
  content_types_provided/2
]).

-export([
  json_request/2,
  json_response/2
]).

init(Req, Opts) ->
  {cowboy_rest, Req, Opts}.

allowed_methods(Req, State) ->
  {[<<"GET">>, <<"POST">>, <<"PATCH">>, <<"DELETE">>], Req, State}.

content_types_accepted(Req, State) ->
  {[
    {<<"application/json">>, json_request}
  ], Req, State}.

content_types_provided(Req, State) ->
  {[
    {<<"application/json">>, json_response}
  ], Req, State}.


json_request(Req, State) ->
  Resp = cowboy_req:set_resp_body(<<"{\"a\":\"b\"}">>, Req),
  cowboy_req:reply(201, Resp),
  {true, Resp, State}.

json_response(Req, State) ->
  {true, Req, State}.

但是,当我发送 http 请求时,在日志中看到错误:

2020-09-17T19:35:58.305000+03:00 error: &lt;0.231.0&gt; [proc_lib:crash_report/4-525] crasher: initial call: cowboy_clear:connection_process/4, pid: &lt;0.231.0&gt;, registered_name: [], error: {function_clause,[cowboy_http,commands,[state,&lt;0.189.0&gt;,http,#Port&lt;0.10&gt;,ranch_tcp,undefined,#{connection_type =&gt; supervisor,env =&gt; #{dispatch =&gt; [{'_',[],[{[&lt;&lt;"api"&gt;&gt;,&lt;&lt;"v.0.1"&gt;&gt;,'...'],[],request_handler,#{}},{[&lt;&lt;"static"&gt;&gt;,'...'],[],cowboy_static,{priv_dir,gateway,"./www/static",[{mimetypes,cow_mimetypes,all}]}},{'_',[],cowboy_static,{priv_file,gateway,"www/index.html"}}]}]},idle_timeout =&gt; infinity,inactivity_timeout =&gt; infinity},&lt;&lt;&gt;&gt;,#{},{{127,0,0,1},18780},{{127,0,0,1},8585},undefined,undefined,true,2,{ps_request_line,0},infinity,1,done,1000,[{stream,1,{cowboy_stream_h,{state,undefined,http,&lt;0.232.0&gt;,undefined,undefined,undefined,undefined,0,fin,&lt;&lt;"{\r\n \"Name\" : \"Test 2\"}\r\n"&gt;&gt;,165,undefined,normal}},&lt;&lt;"POST"&gt;&gt;,'HTTP/1.1',undefined,undefined,0,[]}],[{child,&lt;0.232.0&gt;,1,5000,undefined}]},1,[{response,200,#{&lt;&lt;"content-length"&gt;&gt; =&gt; &lt;&lt;"9"&gt;&gt;,&lt;&lt;"content-type"&gt;&gt; =&gt; [&lt;&lt;"application"&gt;&gt;,&lt;&lt;"/"&gt;&gt;,&lt;&lt;"json"&gt;&gt;,&lt;&lt;&gt;&gt;],&lt;&lt;"date"&gt;&gt; =&gt; &lt;&lt;"Thu, 17 Sep 2020 16:35:57 GMT"&gt;&gt;,&lt;&lt;"server"&gt;&gt; =&gt; &lt;&lt;"Cowboy"&gt;&gt;},&lt;&lt;"{\"a\":\"b\"}"&gt;&gt;}]],[{file,"d:/gateway/_build/default/lib/cowboy/src/cowboy_http.erl"},{line,954}]},{cowboy_http,loop,1,[{file,"d:/gateway/_build/default/lib/cowboy/src/cowboy_http.erl"},{line,254}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,226}]}]}, ancestors: [&lt;0.189.0&gt;,&lt;0.188.0&gt;,ranch_sup,&lt;0.113.0&gt;], message_queue_len: 1, messages: [{'EXIT',&lt;0.232.0&gt;,normal}], links: [#Port&lt;0.10&gt;,&lt;0.189.0&gt;], dictionary: [], trap_exit: true, status: running, heap_size: 1598, stack_size: 28, reductions: 1505; neighbours:

我做错了什么?我查看了示例并在 Google 上搜索了示例。我不明白我的代码与 Internet 上的示例有何不同。

【问题讨论】:

  • 我不是 100% 确定,但是……看起来你回复了两次。你试过从 json_request/2 返回 {false, Resp, State} 吗?
  • 没有,没试过。谢谢。我现在就试试。
  • {false, Resp, State} 来自 json_request/2 - 没有帮助。

标签: rest http erlang cowboy


【解决方案1】:

如上面评论中所述,我发布了两次回复。 下面是它的样子:

json_request(Req, State) ->
  Resp = cowboy_req:set_resp_body(<<"{\"a\":\"b\"}">>, Req),
  cowboy_req:reply(201, Resp),
  {stop, Resp, State}.

非常感谢您的帮助。

【讨论】:

    猜你喜欢
    • 2021-03-26
    • 2013-10-04
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 2012-04-16
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多