Подтвердить что ты не робот

Ruby on Rails: как определить, доступен ли JSON доступ?

У меня есть URL GET, который вызывает метод getInfo. Его можно вызывать mydomain.com/getInfo.json?params=BLAHBLAH или mydomain.com/getInfo?params=BLAHBLAH

В контроллере есть способ определить, как пользователь вызвал его?

4b9b3361

Ответ 1

В пределах вашего конкретного метода контроллера вы можете отвечать на разные форматы - например:

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

Ответ 2

Да. Внутри контроллера вы можете вызвать метод request.format, чтобы определить формат, запрошенный пользователем.

Если вам нужен не только формат, вы можете посмотреть request.url для полного URL-адреса. Подробнее об объекте request можно найти здесь.

Ответ 3

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

Ответ 4

Так же просто:

request.path_parameters[:format] == 'json'

Ответ 5

Если вам нужно проверить, был ли это запрос Ajax, вы можете проверить header[X-Requested-With] с помощью request.xhr?

Пример фрагмента кода

if request.xhr?
  # Do the ajax stuff
else
  # Do normal stuff
end