我正在编写基于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
答案 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
它看起来很草率,所以你可以重定向到另一个提供一些服务的网址