【问题标题】:How to set status code in REST POST in cowboy如何在牛仔的 REST POST 中设置状态码
【发布时间】:2013-06-06 12:28:58
【问题描述】:

如何在我的 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#] [handle_info#35]:从 退出逻辑原因:{function_clause,[{cowboy_req,reply,[ 204,[],>,{http_req,#Port,ranch_tcp,keepalive,,>,'HTTP/1.1',{{127,0,0 ,1},50024},>,undefined,8080,>,[>],>,undefined,[ ],[{>,>},{>,>},{>,/">>},{>,>},{>,>}],[{>,14},{>,未定义},{>,14},{>,{>,>,[]}},{ >,undefined},{>,undefined},{>,undefined},{>,undefined} ,{>,[{{">>,">>,[]},1000,[]}]}],未定义,[ {charset,undefined},{media_type,{>,>,[]}}],done,undefined,>,false,done,[],>,未定义}],[{文件,"src/cowboy_req.erl"},{line,948}]},{cowboy_rest,respond,3,[{file,"src/cowboy_rest.erl"},{line,1085}]},{cowboy_rest,升级,4,[{file,"src/cowboy_rest.erl"},{line,75}]},{cowboy_protocol,execute,4,[{file,"src/cowboy_protocol.erl"},{line,523} ]}]} 21:43:10.510 [错误] [Undefined#Undefined#emulator] [Undefined#Undefined]:进程 中的错误,退出值:{function_clause,[{cowboy_req,reply,[204,[],>,{http_req,#Port,ranch_tcp,keepalive,,>,'HTTP/1.1',{{127,0,0,1},50024} ,>,未定义,8080,>,[>],>,未定义,[],[{>,>},{>,>},{>,>},{>,>},{>,>}],[{>,14},{>,未定义},{>,14},{>,{>,>,[]}},{>,未定义},{>,undefined},{>,undefined},{>,undefined...

在我回复后,牛仔似乎再次尝试发送回复。但是我在 API 中没有任何其他可以更改状态代码的方法。

【问题讨论】:

  • 在你的代码中,set_response_body 是做什么的?它应该和 cowboy_req:set_response_body/2 做同样的事情吗?
  • 是的,它确实 Resp3 = cowboy_req:set_resp_body(>, Req)
  • 我不太清楚你在说你的 set_response_body 做了什么——你介意把它添加到你的问题中吗?
  • 我修改了我的问题并添加了cowboy_req:set_resp_body。

标签: erlang cowboy


【解决方案1】:

正确的解决方案是返回 not {true, Resp3, State}。但是 {halt, Resp3, State}。在这种情况下,cowboy 不会继续处理请求。

【讨论】:

  • documentation 明确说明了这一点。为什么不将您的答案标记为已接受?或许可以通过以下段落来完成答案:“所有回调也可以返回 {halt, Req, State} 以停止请求的执行,此时将调用 rest_terminate/2。” (以及修正错别字等)。
【解决方案2】:

Cowboy 的 rest-handler 将尝试根据回调函数的返回值设置响应状态码(请参阅http://ninenines.eu/docs/en/cowboy/HEAD/guide/rest_handlers)。

为了表明资源已创建(返回 201),因此除了创建主体功能外,您还需要实现 resource_exists 的回调。您还需要在 body-creating 函数中指明新创建资源的 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}.

【讨论】:

  • 201 只是一个例子。我们在旧系统中有不同的状态,我希望有相同的行为。
  • 对,那么您最初的假设是正确的,即“牛仔似乎在我回复后再次尝试发送响应”。 Cowboy 将根据 rest-callbacks 的结果覆盖由 cowboy_req:reply 设置的数据。 cowboy_req:reply 本身并没有发送任何响应,它只是在操纵 rest-handler 的内部状态。除非任何回调响应通过返回停止指示错误,否则在所有处理完成(即所有回调都已完成)之前不会发送响应。
  • mbesso,感谢您的回答,它实际上帮助我使用 PUT 方法实现规范资源创建。
猜你喜欢
  • 2016-05-10
  • 2017-07-26
  • 2013-12-19
  • 2017-02-01
  • 2020-09-28
  • 2017-11-29
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
相关资源
最近更新 更多