Получить абсолютный 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
метод, который вы могли бы попробовать.