Frage Ruby on Rails: Wie erkennt man, ob der Zugriff von JSON möglich ist?


Ich habe eine GET-URL, die eine Controller-Methode getInfo aufruft. Es kann von mydomain.com/getInfo.json?params=BLAHBLAH oder mydomain.com/getInfo?params=BLAHBLAH aufgerufen werden

Gibt es im Controller eine Möglichkeit zu erkennen, wie der Benutzer es aufgerufen hat?


23
2017-09-28 02:28


Ursprung


Antworten:


Innerhalb der spezifischen Methode Ihres Controllers können Sie auf verschiedene Formate reagieren - zum Beispiel:

respond_to do |format|
  format.html
  format.json { render :json => @user }
end

Sie können auf verschiedene Formate reagieren (xml, js, json, etc) - Sie können hier mehr Informationen über respond_to und wie Sie es in Ihrem Controller verwenden:

http://apidock.com/rails/ActionController/MimeResponds/InstanceMethods/respons_to


15
2017-09-28 02:56



Ja. Innerhalb der Steuerung können Sie die request.format Methode, um das vom Benutzer angeforderte Format zu bestimmen.

Wenn Sie mehr als nur das Format benötigen, können Sie es sich ansehen request.url für die vollständige URL. Mehr Details über die request Objekt kann gefunden werden Hier.


29
2017-09-28 02:34



Hier ist ein wirklich etwas ausgeklügeltes Arbeitsbeispiel, das die Frage beantwortet Wie erkennt man, ob es sich bei dem Aufruf um einen JSON / XML-API-Aufruf im Vergleich zu einem "HTML" -Aufruf handelt?. (Akzeptierte Antwort beantwortet diese Frage nicht, sondern sagt Ihnen, wie Sie auf verschiedene Formate reagieren)

# 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

Verwendung einer respond_to legt verschiedene Arten von Antworten fest, teilt Ihrer Anwendung jedoch nicht mit, wie der Anruf getätigt wurde, es sei denn, Sie fügen zusätzlichen Code hinzu (siehe unten für ein einfaches Beispiel, um den Punkt zu verdeutlichen.)

Ich würde das nicht empfehlen und verhören request ist viel sicherer und zehnmal nützlicher, da der folgende Ansatz erst viel später im Anforderungslebenszyklus nützlich ist (direkt bevor die Antwort an den Client gesendet wird). Wenn Sie eine Logik in Ihren Vorfiltern haben, würde das überhaupt nicht funktionieren.

# 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

11
2018-05-18 21:10



So einfach wie:

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

8
2018-05-04 05:07



Wenn Sie überprüfen müssen, ob es sich um eine Ajax-Anfrage handelt, können Sie nach einem suchen header[X-Requested-With] verwenden request.xhr?

Beispielcode-Snippet

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

4
2018-05-04 08:54



Eine Liste der Möglichkeiten, nach json zu suchen

request.format == 'json'
request.format == :json
request.format.json?
request.path.match('json')
request.url.match('json')
respond_to do |format|
  format.json { render json: [] }
end

Sie können auch überprüfen, ob die Anfrage eine Ajax-Anfrage war

request.xhr?

1
2018-05-10 18:45