如何在REST POST资源中设置状态代码。
现在我正在做这个
make_post(Req, State) ->
lager:info("post"),
Resp = cowboy_req:set_resp_body(<<"HELLO POST\n">>, Req),
{ok, Resp3} = cowboy_req:reply(201, Resp),
{true, Resp3, State}.
但是我收到了这样的错误:
1:43:10.510 [info] [nonode @nohost #pbshare_logic_registration#&lt; 0.205.0&gt;] [handle_info#35]:从&lt; 0.204.0&gt;退出逻辑。原因:{function_clause,[{cowboy_req,reply,[204,[],&lt;&lt;&gt;&gt;,{http_req,#Port&lt; 0.6355&gt;,ranch_tcp,keepalive,&lt; 0.204.0&gt;,&lt;&lt; ; “POST” &GT;&GT;, 'HTTP / 1.1',{{127,0,0,1},50024},&LT;&LT; “本地主机” &GT;&GT;,未定义,8080,&LT;&LT;” /休息/注册/使 “&GT;&GT;,并[d&LT;” 做 “&GT;&GT],&LT;&LT;&GT;&GT;,未定义[],[{&LT;&LT;” 用户代理“&GT;&GT;,&LT;&LT;” 卷曲/ 7.29.0 “&GT;&GT;},{&LT;&LT;” 宿主 “&GT;&GT;,&LT;&LT;” 本地主机:8080" &GT;&GT;} ,{&LT;&LT; “接受” &GT;&GT;,&LT;&LT; “ / ” &GT;&GT;},{&LT;&LT; “内容类型” &GT;&GT;,&LT ;&LT; “应用程序/ JSON” &GT;&GT;},{&LT;&LT; “内容长度” &GT;&GT;,&LT;&LT; “14” &GT;&GT;}],[{&LT;&LT;”内容长度 “&GT;&GT;,14},{&LT;&LT;” 期望 “&GT;&GT;,未定义},{&LT;&LT;” 内容长度“&GT;&GT;,14},{&LT;&LT ; “内容类型” &GT;&GT;,{&LT;&LT; “应用” &GT;&GT;,&LT;&LT; “JSON” &GT;&GT;,[]}},{&LT;&LT“;如果改性 - 由于 “&GT;&GT;,未定义},{&LT;&LT;” 如果 - 无匹配 “&GT;&GT;,未定义},{&LT;&LT;” 如果 - 未改性因为“&GT;&GT;,未定义} ,{&LT;&LT “;如果匹配” &GT; &GT;,未定义},{&LT;&LT; “接受” &GT;&GT;,[{{&LT;&LT; “” &GT;&GT;,&LT;&LT; “” &GT;&GT; ,[]},1000,[]}]}],未定义,[{字符集,未定义},{媒体类型,{&LT;&LT; “应用” &GT;&GT;,&LT;&LT; “JSON” &GT;&GT; ,[]}}],做,未定义&LT;&LT;&GT;&GT;,假的,完成的,[],&LT;&LT;&GT;&GT;,未定义}],[{文件,“SRC / cowboy_req.erl “},{线,948}]},{cowboy_rest,响应,3,[{文件,” SRC / cowboy_rest.erl“},{线,1085}]},{cowboy_rest,升级,4,[{文件, “SRC / cowboy_rest.erl”},{线,75}]},{cowboy_protocol,执行,如图4所示,[{文件, “SRC / cowboy_protocol.erl”},{线,523}]}]} 21:43:10.510 [错误] [未定义#未定义#emulator] [未定义#Undefined]:进程错误&lt; 0.204.0&gt;退出值:{function_clause,[{cowboy_req,reply,[204,[],&lt;&lt; 0 bytes&gt;&gt;,{http_req,#Port&lt; 0.6355&gt;,ranch_tcp,keepalive,&lt; 0.204.0&gt;, &lt;&lt;&lt; 4字节&gt;&gt;,'HTTP / 1.1',{{127,0,0,1},50024},&lt;&lt; 9字节&gt;&gt;,未定义,8080,&lt;&lt;&lt;&lt; 23字节&gt; ;&gt;,[&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&gt;&gt;&gt; &gt;},{&lt;&lt;&lt; 4字节&gt;&gt;,&lt;&lt;&lt; 14字节&gt;&gt;},{&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&n;&n;&gt;&gt; ;&lt; 12字节&gt;&gt;,&lt;&lt;&lt; 16字节&gt;&gt;},{&lt;&lt; 14字节&gt;&gt;,&lt;&lt;&lt;&lt;&n;&gt;&gt;},[&lt;&lt;&lt; 14字节&gt;&gt;,14},{&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; &lt; 11字节&gt;&gt;,&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; 17&gt;&gt;&gt; ,{&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; 8&gt;&gt;&gt;&gt;&gt;
似乎牛仔试图在我回复后再次发送回复。但我在API中没有任何其他方法可以更改状态代码。
答案 0 :(得分:6)
正确的解决方案是不返回{true,Resp3,State}。但{halt,Resp3,State}。在这种情况下,牛仔不会继续处理请求。
答案 1 :(得分:2)
Cowboy的rest-handler将尝试根据回调函数的返回值设置响应状态代码(请参阅http://ninenines.eu/docs/en/cowboy/HEAD/guide/rest_handlers)。
为了表明资源已经创建(返回201),除了正文创建函数之外,还需要实现resource_exists的回调。您还需要在正文创建函数中指明新创建的资源的URL。
以下是我认为适合您的方法(记得导出resource_exists
或将使用默认功能):
resource_exists(Req, State) ->
{false, Req, State}.
make_post(Req, State) ->
Req2 = cowboy_req:set_resp_body(<<"Hello world">>, Req),
{{true, "/foo/bar"}, Req2, State}.