У меня есть URL GET, который вызывает метод getInfo. Его можно вызывать mydomain.com/getInfo.json?params=BLAHBLAH или mydomain.com/getInfo?params=BLAHBLAH
В контроллере есть способ определить, как пользователь вызвал его?
У меня есть URL GET, который вызывает метод getInfo. Его можно вызывать mydomain.com/getInfo.json?params=BLAHBLAH или mydomain.com/getInfo?params=BLAHBLAH
В контроллере есть способ определить, как пользователь вызвал его?
В пределах вашего конкретного метода контроллера вы можете отвечать на разные форматы - например:
respond_to do |format|
format.html
format.json { render :json => @user }
end
Вы можете отвечать на различные форматы (xml, js, json и т.д.) - вы можете получить дополнительную информацию о response_to и о том, как использовать его в своем контроллере здесь:
http://apidock.com/rails/ActionController/MimeResponds/InstanceMethods/respond_to
Да. Внутри контроллера вы можете вызвать метод request.format
, чтобы определить формат, запрошенный пользователем.
Если вам нужен не только формат, вы можете посмотреть request.url
для полного URL-адреса. Подробнее об объекте request
можно найти здесь.
Вот несколько несколько надуманный рабочий пример, который отвечает на вопрос о том, как определить, является ли вызов JSON/XML API вызовом "HTML". (Принятый ответ не отвечает на этот вопрос, просто говорит вам, как реагировать на различные форматы)
# We can use this in a before_filter
skip_before_action :verify_authenticity_token, if: :api_request?
# Or in the action
def show
@user = if api_request?
User.where(api_token: params[:token]).first
else
User.find(params[:id])
end
respond_to do |format|
format.html
format.json { render :json => @user }
end
end
private
def api_request?
request.format.json? || request.format.xml?
end
Использование respond_to
устанавливает разные типы ответов, но не сообщает вашему приложению, как был выполнен вызов, если вы не добавили дополнительный код, который его делает (см. ниже пример грубого примера, просто чтобы проиллюстрировать точку. )
Я бы не рекомендовал этого, опрос request
намного безопаснее и в 10 раз более полезен, так как нижеприведенный подход полезен гораздо позже в жизненном цикле запроса (непосредственно перед отправкой ответа клиенту). Если у вас есть какая-либо логика в ваших фильтрах, это не сработает.
# Have no way of using it in a before_filter
# In your controller
def show
# I want to know if the call was JSON API - right here
# This approach wouldn't help at all.
@user = User.find(params[:id])
respond_to do |format|
format.html { @api_request = false}
format.json { @api_request = true; render :json => @user }
end
end
def api_request?
@api_request
end
Так же просто:
request.path_parameters[:format] == 'json'
Если вам нужно проверить, был ли это запрос Ajax, вы можете проверить header[X-Requested-With]
с помощью request.xhr?
Пример фрагмента кода
if request.xhr?
# Do the ajax stuff
else
# Do normal stuff
end