如何使用Sinatra验证标头参数?

时间:2013-11-15 14:48:46

标签: ruby http-headers sinatra http-status-code-404

我正在使用Sinatra开发一个简单的API,我有一条像这样的路线:

get '/api/v1/invoice/:biller', :provides => [:json] do
   respond_with invoice( request )
end

当我不发送任何标题参数时,它就像一个魅力,但当我发送:

  • 接受
  • 内容类型

然后我收到404 Not Found错误,经典的Sinatra错误'Sinatra不知道这个小曲'

如何验证Sinatra上的特定标题参数?

修改

这是带有curl示例的实际标题(Accept):

curl -H "Accept: application/vnd.tpago.billpayment+json" -X GET "http://localhost:3540/api/v1/invoice/5947647"

谢谢!

2 个答案:

答案 0 :(得分:3)

如果您将请求更改为:

curl -H "Accept: application/json" -X GET "http://localhost:3540/api/v1/invoice/5947647"

它可以像Neil建议的那样工作,或者如果你修改你的Sinatra应用程序:

configure do
  # include new mime type
  mime_type :tpago, 'application/vnd.tpago.billpayment'
end

# add into provide options
get '/api/v1/invoice/:biller', :provides => [:tpago,:json] do
   respond_with invoice( request )
end

现在,以下请求将起作用:

curl -H "Accept: application/vnd.tpago.billpayment" -X GET "http://localhost:3540/api/v1/invoice/5947647"

我不完全确定,但我认为“+”符号在Accept标题上不起作用。我在w3文档中没有找到任何关于它的参考。

答案 1 :(得分:0)

谢谢你!

我应用了您的解决方案但后来发现了'respond_with'的问题。它总是返回408 Not Acceptable所以我去了Sinatra's documentation,所以我使用了respond_to:

get '/api/v1/invoice/:biller', :provides => [:tpago,:json] do
  result = invoice( request )
  respond_to do |f|
    f.on('application/vnd.tpago.billpayment+json') { result.to_json }
  end
end

现在它正在运作! :d

再次感谢你!