Normalerweise geben Sie JSON zurück, weil:
A) Sie erstellen einen Teil / Ihre gesamte Anwendung als Single Page Application (SPA) und benötigen Ihr clientseitiges JavaScript, um zusätzliche Daten abrufen zu können, ohne die Seite vollständig neu zu laden.
oder
B) Sie erstellen eine API, die von Dritten verwendet wird, und Sie haben sich entschieden, JSON zum Serialisieren Ihrer Daten zu verwenden.
Oder möglicherweise essen Sie Ihr eigenes Hundefutter und tun beides
In beiden Fällen render :json => some_data
werden die bereitgestellten Daten von JSON überprüft. Der :callback
Schlüssel im zweiten Beispiel muss etwas näher erläutert werden (siehe unten), es handelt sich jedoch um eine andere Variante derselben Idee (Rückgabe von Daten auf eine Weise, die mit JavaScript problemlos verarbeitet werden kann).
Warum :callback
?
JSONP (das zweite Beispiel) ist eine Möglichkeit, die Same Origin-Richtlinie zu umgehen , die Teil der integrierten Sicherheit jedes Browsers ist. Wenn Sie Ihre API unter haben api.yoursite.com
und Ihre Anwendung über services.yoursite.com
Ihr JavaScript bereitstellen, können Sie (standardmäßig) keine XMLHttpRequest
(XHR - auch bekannt als Ajax) Anfragen von services
bis stellen api
. Die Leute haben sich um diese Einschränkung herumgeschlichen (bevor die Cross-Origin Resource Sharing-Spezifikation fertiggestellt wurde ), indem sie die JSON-Daten vom Server gesendet haben, als wäre es JavaScript anstelle von JSON . Also anstatt zurückzusenden:
{"name": "John", "age": 45}
Der Server würde stattdessen zurücksenden:
valueOfCallbackHere({"name": "John", "age": 45})
Auf diese Weise könnte eine clientseitige JS-Anwendung ein script
Tag erstellen, auf das verweist, api.yoursite.com/your/endpoint?name=John
und die valueOfCallbackHere
Funktion (die im clientseitigen JS definiert werden müsste) mit den Daten dieses anderen Ursprungs aufgerufen werden .
to_json
Methoden zu vereinfachen - Mischen und Das Zusammenpassen der beidenrender :json => some_object_that_uses_JBuilder_to_render_its_json
ist (soweit ich das beurteilen kann) erlaubt.Was willst du genau wissen? ActiveRecord verfügt über Methoden zum Serialisieren von Datensätzen in JSON. Öffnen Sie beispielsweise Ihre Rails-Konsole und geben
ModelName.all.to_json
Sie ein, und Sie sehen die JSON-Ausgabe.render :json
ruft im Wesentlichento_json
das Ergebnis auf und gibt es mit den richtigen Headern an den Browser zurück. Dies ist nützlich für AJAX-Aufrufe in JavaScript, bei denen Sie JavaScript-Objekte zur Verwendung zurückgeben möchten. Darüber hinaus können Sie mit diesercallback
Option den Namen des Rückrufs angeben, den Sie über JSONP aufrufen möchten.Nehmen wir zum Beispiel an, wir haben ein
User
Modell, das so aussieht:{name: 'Max', email:' [email protected]'}
Wir haben auch einen Controller, der so aussieht:
Wenn wir nun einen AJAX-Aufruf mit jQuery wie folgt ausführen:
Wie Sie sehen, haben wir es geschafft, den Benutzer mit der ID 5 aus unserer Rails-App abzurufen und in unserem JavaScript-Code zu verwenden, da er als JSON-Objekt zurückgegeben wurde. Die Rückrufoption ruft nur eine JavaScript-Funktion des Namens auf, die mit dem JSON-Objekt als erstem und einzigem Argument übergeben wurde.
callback
Sehen Sie sich Folgendes an, um ein Beispiel für die Option zu geben :Jetzt können wir eine JSONP-Anfrage wie folgt erstellen:
Die Motivation für die Verwendung eines solchen Rückrufs besteht normalerweise darin, den Browserschutz zu umgehen, der die gemeinsame Nutzung von Ressourcen zwischen Quellen (CORS) einschränkt. JSONP wird jedoch nicht mehr so häufig verwendet, da andere Techniken zur Umgehung von CORS existieren, die sicherer und einfacher sind.
quelle
callback:
Option zurrender
Methode und anschließendes Anzeigen imAjax
Aufruf.Zum Beispiel
Sie geben an, dass Sie
@projects
als JSON rendern möchten , und fügen die Zuordnungtasks
zum Projektmodell in die exportierten Daten ein.Zum Beispiel
Sie geben an, dass Sie
@projects
als JSON rendern möchten , und verpacken diese Daten in einen Javascript-Aufruf, der wie folgt gerendert wird:Auf diese Weise können die Daten an das übergeordnete Fenster gesendet und standortübergreifende Fälschungsprobleme umgangen werden.
quelle