Получите абсолютный URL-адрес с помощью приложения Grape-Api gem on Rack

Я делаю API с grape gem, в одной из моих служб я хотел бы получить полный URL . Например, если пользователь запрашивает:

api.myapp.com/android/users.json

Я хотел бы получить api.myapp.com/android/users.json или хотя бы /android/users.json

class MyApp::API::Users < Grape::API

    resource :users do

        get do
            request.original_url
            # stuff ...
        end
    end
end

Я пробовал то, что знаю из Rails, но теперь это Grape, и он не работает:

  "error": "undefined method `original_url' for #<Grape::Request:0x00000005a78c08>"

person Pierre    schedule 27.08.2014    source источник


Ответы (2)


Я хотел сделать то же самое (сгенерировать абсолютные URI) в своем собственном API, и после долгих исследований я в конце концов отказался. Поразительно, но я не могу найти хорошего способа получить информацию, которую вы ищете, из Grape. Вы не можете, например, указать, что ресурс «смонтирован» по определенному пути, а затем получить эту информацию позже.

Тем временем я сохранял базовый URL-адрес (схему, имя хоста и порт) в глобальной переменной в начале каждого запроса:

before do
  # Save the base URL of the request, used by resources to build
  # their canonical URI
  Resources::base_url = request.base_url
end

а затем в каждом представителе ресурсов «вручную» собирают URI с использованием жестко заданной информации о пути:

link :self do
  RideYork::API::Resources::base_url +
    "/resources/agencies/#{represented.id}" if represented.id
end

Это ужасный взлом, но я не знаю лучшего решения.

person Community    schedule 27.08.2014
comment
Я понимаю, что вы предлагаете, но в моем случае это не подходит. У меня есть два приложения (одно для Android и одно для iOS), и я хотел бы, чтобы они отправляли запрос на api.myapp.com/android/users.json или api.myapp.com/iphone/users.json, чтобы знать на стороне сервера, какой тип устройства запрашивает. Есть ли у вас какие-либо идеи ? - person Pierre; 28.08.2014
comment
Что ж, обычно вы используете HTTP-заголовок, чтобы определить, какой тип клиента подключается - считается плохим тоном иметь несколько URI, которые указывают на разные представления одного и того же базового ресурса. Приходилось ли вам использовать заголовок User-Agent для этого цель? - person ; 29.08.2014
comment
Когда я это сделал. И я, вероятно, сделаю так, как вы говорите. - person Pierre; 29.08.2014

Grape::Request - это просто _ 2_. Похоже, у Rack::Request есть метод #url, который вы можете попробовать.

person Nick Veys    schedule 27.08.2014
comment
Вы почти правы, но он возвращает http://api2.myapp.com/users.json, когда я набираю http://api2.myapp.com/android/users.json - person Pierre; 27.08.2014
comment
Документы говорят, что он пытается воссоздать этот URL, поэтому некоторая информация должна быть потеряна ... Вы используете прокси, например nginx или что-то в этом роде? Вы можете попробовать метод #headers и посмотреть, есть ли в нем что-нибудь полезное. - person Nick Veys; 27.08.2014
comment
Больше ничего с headers методом. Я использую nginx и, может быть, я неправильно переписал? location /android { rewrite /android/(.*) /$1 break; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://api2; } - person Pierre; 27.08.2014
comment
это именно то, что вы просили: /android/users.json переписывается как /users.json - person tomsoft; 27.08.2014
comment
да, но я хотел бы получить то, что запросил пользователь / android или / что-то - person Pierre; 28.08.2014