Получить абсолютный URL с помощью Grape-Api gem в приложении 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>"

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

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

Grape::Request это просто Rack::Request, Похоже, Rack::Request имеет #url метод, который вы могли бы попробовать.

Другие вопросы по тегам