2016-08-13 13 views
2

Есть ли способ, которым я могу использовать общий заголовок в Rails с Grape, поэтому мне не нужно указывать один и тот же заголовок снова и снова?Как добавить общий заголовок в Rails с Grape?

namespace :user do 
    desc 'Return a user.', { 
    headers: { 
     "Authorization" => { 
     description: "Some Token", 
     required: true 
     } 
    } 
    } 
    get do 
    {} 
    end 
end 

Обратите внимание, что заголовки должны быть указаны снова и снова во всех моих API, так как я хочу, чтобы они были в безопасности. Есть ли ярлык (шаблон дизайна), который я могу отслеживать, не создавая этот заголовок каждый раз?

И нет, я не искал что-то вроде этого:

def headers 
    { 
    "Authorization" => { 
     description: "Some Token", 
     required: true 
    } 
    } 
end 

namespace :user do 
    desc 'Return a user.', { 
    headers: headers 
    } 
    get do 
    {} 
    end 
end 
+2

Почему определение функции headers' пример не хорошо? Вы слишком быстро отказываетесь от этой опции. Вы всегда можете заставить метод принимать аргументы и объединять их в хэш результата. –

+0

Шаблон проектирования, который вы можете использовать, - наследование. Создайте базовый класс, который всегда реализует заголовок авторизации и простирается от него. – Rots

ответ

1

Это то, что я сделал:

приложение/API/api.rb

def my_headers 
    { 
    key1: { 
     description: 'hello', 
     required: true 
    }, 
    key2: { 
     description: 'hello', 
     required: false 
    } 
    } 
end 

# define my_headers outside of API class 

class API < Grape::API 
    version 'v1', using: :param, parameter: 'v', vendor: 'Larvata' 
    content_type :json, 'application/json' 

    # some codes ... 

приложение/API/home.rb

class Home < API 

resources :home do 

    desc "Home Page", { headers: my_headers } 
    get do 
     # some codes ... 

oh, извините, вы ищете это решение ...

+0

Переместить 'def my_headers' ниже на' resource: home' тоже работает, может быть лучше? – fangxing

+0

Но вы должны определить его в каждом ресурсе. – zx1986

1

Это хорошо работает.
Вы можете добавить метод класса, который возвращает определения заголовков в класс api root и вызывает его из каждого класса api.

приложение/API/root.rb

module Api 
    class Root < Grape::API 
    def self.headers_definition 
     { 
     "Authorization" => { 
      description: "Some Token", 
      required: true 
     } 
     } 
    end 

    mount Home 
    end 
end 

приложение/API/home.rb

module Api 
    class Home < Grape::API 
    resources :home do 

     desc "Home Page", headers: Root.headers_definition 
     get do 
     # some codes ... 
     end 
     end 
    end 
    end 
end