如何从之前的块返回JSON响应

时间:2017-04-19 20:51:46

标签: ruby sinatra

我正在编写基于Sinatra的API,并希望使用API​​密钥保护某些端点,在处理路由之前验证密钥。

我理解为什么在before块中抛出错误并不起作用,因为尚未调用begin / rescue语句,但我想要将JSON响应发送回客户端,并将错误消息作为JSON对象发送。

我该怎么做?

namespace '/v1/sponser/:key' do

  before do
    if APIHelper.valid_key?(params[:key]) == false
      throw 'Error, invalid API key'
      # is it possible to return a JSON response from the before statement here?
    end
  end

  get '/test' do
    begin
      json status: 200, body: 'just a test'
    rescue => error
      json status: 404, error: error
    end
  end

end

2 个答案:

答案 0 :(得分:1)

我会考虑使用halt

before do
  unless APIHelper.valid_key?(params[:key])
    halt 404, { 'Content-Type' => 'application/json' }, 
              { error: 'Error, invalid API key' }.to_json
  end
end

get '/test' do
  json status: 200, body: 'just a test'
end

答案 1 :(得分:0)

您可以使用halt方法返回具有特定代码,正文和标题的响应。所以它看起来像这样: before do halt 401, {'Content-Type' => 'application/json'}, '{"Message": "..."}' end 它看起来很草率,所以你可以重定向到另一个提供一些服务的网址