Im folgenden Code $http
ruft die AngularJS- Methode die URL auf und sendet das xsrf-Objekt als "Request Payload" (wie auf der Registerkarte "Chrome-Debugger-Netzwerk" beschrieben). Die jQuery- $.ajax
Methode führt denselben Aufruf aus, sendet jedoch xsrf als "Formulardaten".
Wie kann ich AngularJS veranlassen, xsrf als Formulardaten anstelle einer Anforderungsnutzlast zu senden?
var url = 'http://somewhere.com/';
var xsrf = {fkey: 'xsrf key'};
$http({
method: 'POST',
url: url,
data: xsrf
}).success(function () {});
$.ajax({
type: 'POST',
url: url,
data: xsrf,
dataType: 'json',
success: function() {}
});
ajax
angularjs
post
angular-http
Mjibson
quelle
quelle
Antworten:
Die folgende Zeile muss dem übergebenen $ http-Objekt hinzugefügt werden:
Die übergebenen Daten sollten in eine URL-codierte Zeichenfolge konvertiert werden:
Sie haben also so etwas wie:
Von: https://groups.google.com/forum/#!msg/angular/5nAedJ1LyO0/4Vj_72EZcDsJ
AKTUALISIEREN
Informationen zum Verwenden neuer Dienste, die mit AngularJS V1.4 hinzugefügt wurden, finden Sie unter
quelle
var xsrf = $.param({fkey: "key"});
dumm, warum kann Angular es nicht intern tun?headers: {Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}
Wenn Sie jQuery nicht in der Lösung verwenden möchten, können Sie dies versuchen. Lösung von hier geschnappt https://stackoverflow.com/a/1714899/1784301
quelle
for
Anweisung ein wenig zu ändern , um sieangular.forEach
stattdessen zu verwenden .obj[p]
nicht null oder undefiniert ist . Andernfalls senden Sie am Ende "null" oder "undefiniert" als Wert.transformRequest: function(obj)
da obj undefiniert ist. Nehmen wir an, wir übergeben das xsrf? GefällttransformRequest: function(xsrf)
Die anhaltende Verwirrung um dieses Thema hat mich dazu inspiriert, einen Blog-Beitrag darüber zu schreiben. Die Lösung, die ich in diesem Beitrag vorschlage, ist besser als Ihre derzeit am besten bewertete Lösung, da Sie nicht darauf beschränkt sind, Ihr Datenobjekt für $ http-Dienstaufrufe zu parametrisieren. Mit meiner Lösung können Sie also einfach weiterhin tatsächliche Datenobjekte an $ http.post () usw. übergeben und trotzdem das gewünschte Ergebnis erzielen.
Die am besten bewertete Antwort basiert auch auf der Aufnahme von vollständigem jQuery in die Seite für die Funktion $ .param (), während meine Lösung jQuery-unabhängig und rein AngularJS-fähig ist.
http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/
Hoffe das hilft.
quelle
ASP.NET
dies nicht "nativ" unterstützt hat. Wenn Sie das Verhalten von AngularJS nicht ändern möchten (was ich nicht getan habe, weil meine API JSON zurückgibt, warum sollte sie nicht auch JSON akzeptieren, es ist flexibler als Formulardaten), können Sie aus dem lesenRequest.InputStream
und dann auf irgendeine Weise damit umgehen du willst es. (Ich habe esdynamic
ausIch nahm einige der anderen Antworten und machte etwas sauberer.
.config()
Setzen Sie diesen Aufruf an das Ende Ihres angle.module in Ihrer app.js:quelle
unshift()
damit die anderen Transformationen ungestört bleiben. Gute Arbeit.Ab AngularJS v1.4.0 gibt es einen integrierten
$httpParamSerializer
Dienst, der jedes Objekt gemäß den auf der Dokumentseite aufgeführten Regeln in einen Teil einer HTTP-Anforderung konvertiert .Es kann folgendermaßen verwendet werden:
Denken Sie daran, dass für einen korrekten Formularbeitrag die
Content-Type
Kopfzeile geändert werden muss. Um dies global für alle POST-Anfragen zu tun, kann dieser Code (aus Albireos halber Antwort entnommen) verwendet werden:Um dies nur für den aktuellen Beitrag zu tun, muss die
headers
Eigenschaft des Anforderungsobjekts geändert werden:quelle
transformRequest: $httpParamSerializer, data: formDataObj
. Danke für die Lösung.Sie können das Verhalten global definieren:
Sie müssen es also nicht jedes Mal neu definieren:
quelle
Um dieses Problem zu umgehen, können Sie den Code, der den POST empfängt, einfach auf Anwendungs- / JSON-Daten reagieren lassen. Für PHP habe ich den folgenden Code hinzugefügt, damit ich ihn entweder formularcodiert oder JSON POSTEN kann.
quelle
Diese Antworten sehen aus wie verrückter Overkill, manchmal ist einfach einfach besser:
quelle
Content-Type
und auf setzenapplication/x-www-form-urlencoded
.Sie können mit der folgenden Lösung versuchen
quelle
Erstellen Sie einen Adapterdienst für die Post:
Verwenden Sie es in Ihren Controllern oder was auch immer:
quelle
Es gibt ein wirklich nettes Tutorial, das dieses und andere verwandte Themen behandelt - Einreichen von AJAX-Formularen: The AngularJS Way .
Grundsätzlich müssen Sie den Header der POST-Anforderung festlegen, um anzuzeigen, dass Sie Formulardaten als URL-codierte Zeichenfolge senden, und die zu sendenden Daten im selben Format festlegen
Beachten Sie, dass die Hilfsfunktion param () von jQuery hier zum Serialisieren der Daten in eine Zeichenfolge verwendet wird. Sie können dies jedoch auch manuell tun, wenn Sie jQuery nicht verwenden.
quelle
$.param
machen die Magie. perfekte Lösung für diejenigen, die eine auf jQuery + AngularJS basierende App haben.Bitte checken sie aus! https://uncorkedstudios.com/blog/multipartformdata-file-upload-with-angularjs
quelle
Für Symfony2-Benutzer:
Wenn Sie nichts in Ihrem Javascript ändern möchten, damit dies funktioniert, können Sie diese Änderungen in Ihrer Symfony-App vornehmen:
Erstellen Sie eine Klasse, die die Klasse Symfony \ Component \ HttpFoundation \ Request erweitert:
Verwenden Sie jetzt Ihre Klasse in app_dev.php (oder einer beliebigen Indexdatei, die Sie verwenden).
quelle
Nur den Inhaltstyp festzulegen ist nicht genug, URL-Codierung von Formulardaten vor dem Senden.
$http.post(url, jQuery.param(data))
quelle
Ich verwende derzeit die folgende Lösung , die ich gefunden in der AngularJS Gruppe googeln.
Beachten Sie, dass Sie, wenn Sie PHP verwenden, etwas wie Symfony 2-HTTP-Komponenten verwenden müssen
Request::createFromGlobals()
, um dies zu lesen, da $ _POST nicht automatisch damit geladen wird.quelle
AngularJS macht es richtig, da es den folgenden Inhaltstyp im http-Request-Header ausführt:
Wenn Sie mit PHP wie mir oder sogar mit Symfony2 arbeiten, können Sie einfach Ihre Serverkompatibilität für den json-Standard wie hier beschrieben erweitern: http://silex.sensiolabs.org/doc/cookbook/json_request_body.html
Der Symfony2-Weg (z. B. in Ihrem DefaultController):
Der Vorteil wäre, dass Sie den jQuery-Parameter nicht verwenden müssen und AngularJS als native Methode zur Ausführung solcher Anforderungen verwenden können.
quelle
Vollständige Antwort (seit Winkel 1.4). Sie müssen de dependency $ httpParamSerializer einschließen
quelle
In Ihrer App-Konfiguration -
Mit Ihrer Ressourcenanfrage -
quelle
Dies ist keine direkte Antwort, sondern eine etwas andere Designrichtung:
Veröffentlichen Sie die Daten nicht als Formular, sondern als JSON-Objekt, das direkt dem serverseitigen Objekt zugeordnet werden soll, oder verwenden Sie die Pfadvariable im REST-Stil
Jetzt weiß ich, dass keine der beiden Optionen in Ihrem Fall geeignet ist, da Sie versuchen, einen XSRF-Schlüssel zu übergeben. Die Zuordnung zu einer Pfadvariablen wie dieser ist ein schreckliches Design:
Denn von Natur aus wollen Sie auch XSRF Schlüssel zum anderen Weg passieren,
/login
,/book-appointment
usw. , und Sie wollen nicht zu verwirren Ihre hübsche URLInteressanterweise ist das Hinzufügen als Objektfeld ebenfalls nicht geeignet, da Sie jetzt für jedes JSON-Objekt, das Sie an den Server übergeben, das Feld hinzufügen müssen
Sie möchten Ihrer serverseitigen Klasse sicherlich kein weiteres Feld hinzufügen, das keine direkte semantische Zuordnung zum Domänenobjekt hat.
Meiner Meinung nach ist der beste Weg, Ihren xsrf-Schlüssel zu übergeben, ein HTTP-Header. Viele serverseitige Webframework-Bibliotheken mit xsrf-Schutz unterstützen dies. In Java Spring können Sie es beispielsweise über den
X-CSRF-TOKEN
Header übergeben .Die hervorragende Fähigkeit von Angular, JS-Objekte an UI-Objekte zu binden, bedeutet, dass wir die Praxis des gemeinsamen Postens von Formularen loswerden und stattdessen JSON veröffentlichen können. JSON kann leicht in serverseitige Objekte de-serialisiert werden und unterstützt komplexe Datenstrukturen wie Map, Arrays, verschachtelte Objekte usw.
Wie postet man ein Array in einer Formularnutzlast? Vielleicht so:
oder dieses:
Beide sind schlechtes Design ..
quelle
Dies ist, was ich für meine Bedürfnisse tue, wo ich die Anmeldedaten als Formulardaten an die API senden muss und das Javascript-Objekt (userData) automatisch in URL-codierte Daten konvertiert wird
So sind meine Userdata
quelle
Das einzige Problem, das Sie ändern müssen, ist die Verwendung der Eigenschaft "params" anstelle von "data", wenn Sie Ihr $ http-Objekt erstellen:
Im obigen Beispiel ist clients [i] nur ein JSON-Objekt (in keiner Weise serialisiert). Wenn Sie "params" anstelle von "data" verwenden, serialisiert Angular das Objekt für Sie mithilfe von $ httpParamSerializer: https://docs.angularjs.org/api/ng/service/ $ httpParamSerializer
quelle
Verwenden Sie den AngularJS-
$http
Dienst und verwenden Sie dessenpost
Methode oder Konfigurationsfunktion$http
.quelle