创建一个使用Sinatra的路由只接受某种内容类型

jfc*_*lvo 7 ruby json content-type routes sinatra

我正在尝试用Sinatra创建一条只接受POST Content-type: application/json但没有成功的路线.

我的方法如下:

post '/dogs', :provides => :json do
  # returns here a json response
end
Run Code Online (Sandbox Code Playgroud)

用curl测试,我已经看到:provides => :json配置路由以响应Content-Type: application/json.

这是正确的,因为我还希望用POST消息的JSON消息进行响应,但我真的需要这条路由只响应一个Content-Type: application/json而不是其他人(例如Content-Type: application/xml)的POST请求.

在Sinatra有什么方法可以限制路由只接受某个请求Content-Type吗?

phi*_*kov 12

请求不包含"Content-Type"标头,而是包含"Accept".Sinatra基本上只应该响应包含"application/json"的"Accept"的请求.只想确认一下:

post '/gods', :provides => :json do
  pass unless request.accept? 'application/json'
...
end
Run Code Online (Sandbox Code Playgroud)

  • 内容类型实际上属于实体部分,http://www.w3.org/Protocols/rfc2616/rfc2616-sec7.html.它是请求或响应的有效标头,用于更正上述内容."接受"用于定义您作为客户愿意收回的内容(您可以定义多个)."内容类型"是请求/响应的组成部分.即,如果我将json发布到端点,则内容类型需要是application/json (12认同)
  • Phil我不这么认为,实际上在POST头HTTP请求中同时提供`Content-Type`和`Accept`是个好主意.例如,您可以使用`Content-Type:application/json`并在POST标题的下一行`Accept:application/json`. (3认同)

小智 10

读这个

http://rack.rubyforge.org/doc/classes/Rack/Request.html

request.content_type 会告诉你的

Phil对于RFC可能是对的,但实际上很多事情都是在POST请求中放入内容类型,因此知道它是什么很有用.