Kann mir jemand sagen, warum die folgende Erklärung die Post-Daten nicht an die angegebene URL sendet? Die URL wird aufgerufen, aber auf dem Server, wenn ich $ _POST drucke - ich erhalte ein leeres Array. Wenn ich eine Nachricht in der Konsole drucke, bevor ich sie zu den Daten hinzufüge, wird der richtige Inhalt angezeigt.
$http.post('request-url', { 'message' : message });
Ich habe es auch mit den Daten als Zeichenfolge versucht (mit dem gleichen Ergebnis):
$http.post('request-url', "message=" + message);
Es scheint zu funktionieren, wenn ich es im folgenden Format verwende:
$http({
method: 'POST',
url: 'request-url',
data: "message=" + message,
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
});
Aber gibt es eine Möglichkeit, dies mit $ http.post () zu tun - und muss ich immer den Header einfügen, damit es funktioniert? Ich glaube, dass der obige Inhaltstyp das Format der gesendeten Daten angibt, aber kann ich sie als Javascript-Objekt senden?
angularjs
post
angular-http
Spencer Mark
quelle
quelle
Antworten:
Ich hatte das gleiche Problem mit asp.net MVC und fand hier die Lösung
Klappt wunderbar.
CODE
quelle
bower install angular-post-fix --save-dev
es hinzuzufügen.Es ist oben nicht sehr klar, aber wenn Sie die Anfrage in PHP erhalten, können Sie verwenden:
$params = json_decode(file_get_contents('php://input'),true);
Zugriff auf ein Array in PHP über einen AngularJS-POST.
quelle
json_decode(file_get_contents('php://input'), true);
Sie können den Standard "Inhaltstyp" wie folgt festlegen:
Über das
data
Format:Versuchen Sie, diese Variante zu verwenden
quelle
Ich hatte ein ähnliches Problem und frage mich, ob dies auch nützlich sein kann: https://stackoverflow.com/a/11443066
Grüße,
quelle
Ich verwende gerne eine Funktion, um Objekte in Post-Parameter umzuwandeln.
quelle
Dies wurde schließlich in Winkel 1.4 mit $ httpParamSerializerJQLike behoben
Siehe https://github.com/angular/angular.js/issues/6039
quelle
Ich verwende jQuery param mit AngularJS post requrest. Hier ist ein Beispiel ... erstellen AngularJS Anwendungsmodul, in dem
myapp
mit definiert istng-app
in Ihrem HTML - Code.Lassen Sie uns nun einen Login-Controller sowie eine POST-E-Mail und ein Passwort erstellen.
Ich möchte den Code nicht erklären, er ist einfach zu verstehen :) Beachten Sie, dass er
param
von jQuery stammt. Sie müssen also sowohl jQuery als auch AngularJS installieren, damit er funktioniert. Hier ist ein Screenshot.Hoffe das ist hilfreich. Vielen Dank!
quelle
Ich hatte das gleiche Problem mit AngularJS und Node.js + Express 4 + Router
Der Router erwartet die Daten von der Anforderung des Posts im Hauptteil. Dieser Körper war immer leer, wenn ich dem Beispiel von Angular Docs folgte
Notation 1
Aber wenn ich es in den Daten verwendet habe
Notation 2
Bearbeiten 1:
Andernfalls erwartet der Router von node.js die Daten in req.body, wenn Notation 1 verwendet wird:
Welches sendet die Informationen auch als JSON-Nutzdaten. Dies ist in einigen Fällen besser, in denen Sie Arrays in Ihrem json haben und x-www-form-urlencoded einige Probleme verursacht.
es funktionierte. Ich hoffe es hilft.
quelle
Im Gegensatz zu JQuery und aus Gründen der pedantry, Angular verwendet JSON Format für POST Datenübertragung von einem Client an den Server (JQuery vermutlich x-www-form-urlencoded gilt, obwohl JQuery und winklige JSON verwendet für die Daten imput). Daher gibt es zwei Teile des Problems: im js-Client-Teil und im Server-Teil. Deswegen brauchst du:
Setzen Sie js Angular Client-Teil wie folgt:
UND
Schreiben Sie in Ihren Serverteil, um Daten von einem Client zu erhalten (wenn es PHP ist).
Hinweis: $ _POST funktioniert nicht!
Die Lösung funktioniert hoffentlich gut für mich und für Sie.
quelle
So senden Sie Daten per Post-Methode mit
$http
Angularjs müssen Sie diese änderndata: "message=" + message
mitdata: $.param({message:message})
quelle
Um auf der Antwort von @ felipe-miosso aufzubauen:
Fügen Sie es Ihrer Anwendung hinzu:
quelle
Ich habe nicht den Ruf zu kommentieren, aber als Antwort / Ergänzung zu Don Fs Antwort:
$params = json_decode(file_get_contents('php://input'));
Ein zweiter Parameter von
true
muss zurjson_decode
Funktion hinzugefügt werden, um ein assoziatives Array ordnungsgemäß zurückzugeben:$params = json_decode(file_get_contents('php://input'), true);
quelle
Winkelig
WebAPI 2
quelle
Dieser Code hat das Problem für mich gelöst. Es ist eine Lösung auf Anwendungsebene:
quelle
Fügen Sie dies in Ihre js-Datei ein:
und fügen Sie dies Ihrer Serverdatei hinzu:
Das sollte funktionieren.
quelle
Ich hatte auch ein ähnliches Problem und ich machte so etwas und das hat nicht funktioniert. Mein Spring-Controller konnte die Datenparameter nicht lesen.
Aber als ich dieses Forum und das API-Dokument gelesen habe, habe ich versucht, den folgenden Weg zu gehen, und das hat bei mir funktioniert. Wenn jemand auch ein ähnliches Problem hat, können Sie es auch unten versuchen.
Bitte überprüfen Sie https://docs.angularjs.org/api/ng/service/ $ http # post, was param config tut. {data: '"id": "1"'} - Zuordnung von Zeichenfolgen oder Objekten, die in URL umgewandelt werden? data = "id: 1"
quelle
Dies ist wahrscheinlich eine späte Antwort, aber ich denke, der beste Weg ist, denselben Code-Winkel zu verwenden, wenn Sie eine "get" -Anforderung ausführen. Sie
$httpParamSerializer
müssen ihn in Ihren Controller einspeisen, damit Sie einfach die folgenden Schritte ausführen können, ohne dies tun zu müssen benutze Jquery überhaupt,$http.post(url,$httpParamSerializer({param:val}))
quelle
In meinem Fall löse ich das Problem folgendermaßen:
Sie müssen JSON.stringify für jeden Parameter verwenden, der ein JSON-Objekt enthält, und dann Ihr Datenobjekt mit "$ .param" erstellen :-)
NB: Mein "objJSON" ist ein JSON-Objekt, das Array-, Integer-, String- und HTML-Inhalte enthält. Seine Gesamtgröße beträgt> 3500 Zeichen.
quelle
Ich weiß, hat die Antwort akzeptiert . Das Folgen kann jedoch zukünftigen Lesern helfen, wenn die Antwort aus irgendeinem Grund nicht zu ihnen passt.
Angular macht Ajax nicht wie jQuery. Während ich versuchte, der Anleitung zum Ändern des Winkels zu folgen
$httpprovider
, stieß ich auf andere Probleme. ZB verwende ich einen Codeigniter, bei dem die$this->input->is_ajax_request()
Funktion immer fehlgeschlagen ist (der von einem anderen Programmierer geschrieben und global verwendet wurde, also nicht geändert werden kann) und der besagt, dass dies keine echte Ajax-Anfrage war.Um es zu lösen, nahm ich Hilfe von aufgeschobenen Versprechen . Ich habe es in Firefox und ie9 getestet und es hat funktioniert.
Ich habe folgende Funktion außerhalb eines der Winkelcodes definiert . Diese Funktion führt einen regelmäßigen jquery ajax-Aufruf durch und gibt ein zurückgestelltes / versprochenes Objekt (ich lerne noch) zurück.
Dann nenne ich es Winkelcode mit dem folgenden Code. Bitte beachten Sie, dass wir das
$scope
manuell mit aktualisieren müssen$scope.$apply()
.Dies ist möglicherweise nicht die perfekte Antwort, aber es ermöglichte mir, jquery ajax-Aufrufe mit Winkel zu verwenden und die zu aktualisieren
$scope
.quelle
Ich hatte das gleiche Problem in Express .. um zu lösen, müssen Sie Bodyparser verwenden, um JSON-Objekte zu analysieren, bevor Sie http-Anfragen senden ..
quelle
Ich hoffe es hilft.
quelle
Es wurde kein vollständiger Codeausschnitt gefunden, wie die Methode $ http.post zum Senden von Daten an den Server verwendet wird und warum dies in diesem Fall nicht funktioniert.
Erläuterungen zum folgenden Codeausschnitt ...
Festlegen des Inhaltstyps in der Konfigurationsvariablen, die zusammen mit der Anforderung von angleJS $ http.post übergeben wird, die den Server anweist, dass wir Daten im WWW-Post-Format senden.
Beachten Sie die $ htttp.post-Methode, bei der ich den ersten Parameter als URL, den zweiten Parameter als Daten (serialisiert) und den dritten Parameter als Konfiguration sende.
Der verbleibende Code ist selbstverständlich.
Schauen Sie sich hier das Codebeispiel der $ http.post-Methode an .
quelle
Wenn Sie PHP verwenden, ist dies eine einfache Möglichkeit, über einen AngularJS-POST auf ein Array in PHP zuzugreifen.
quelle
Wenn Sie Angular> = 1.4 verwenden , finden Sie hier die sauberste Lösung mit dem von Angular bereitgestellten Serializer :
Und dann können Sie dies einfach überall in Ihrer App tun:
Die Daten werden dann korrekt serialisiert
param1=value1¶m2=value2
und/requesturl
mit demapplication/x-www-form-urlencoded; charset=utf-8
Content-Type-Header an gesendet, wie dies normalerweise bei POST-Anforderungen auf Endpunkten zu erwarten ist.TL; DR
Während meiner Recherche fand ich heraus, dass die Antwort auf dieses Problem in vielen verschiedenen Geschmacksrichtungen vorliegt. Einige sind sehr kompliziert und hängen von benutzerdefinierten Funktionen ab, andere von jQuery und andere weisen unvollständig darauf hin, dass Sie nur den Header festlegen müssen.
Wenn Sie nur den
Content-Type
Header festlegen , werden auf dem Endpunkt die POST-Daten angezeigt, jedoch nicht im Standardformat, es sei denn, Sie geben eine Zeichenfolge als Ihre andata
alle Daten als JSON serialisiert werden, es an oder serialisieren Ihr Datenobjekt manuell Standard und kann am Endpunkt falsch interpretiert werden.Wenn im obigen Beispiel beispielsweise nicht der richtige Serializer festgelegt wurde, wird dies im Endpunkt wie folgt angezeigt:
Dies kann zu unerwartetem Parsen führen, z. B. wird es von ASP.NET als
null
Parametername mit einem{"param1":"value1","param2":"value2"}
Wert behandelt. oder Fiddler interpretiert es andersherum,{"param1":"value1","param2":"value2"}
als Parameternamen undnull
als Wert.quelle
Ähnlich wie das vom OP vorgeschlagene Arbeitsformat und die Antwort von Denison, außer dass
$http.post
statt nur verwendet wird$http
und immer noch von jQuery abhängig ist.Das Gute an der Verwendung von jQuery ist, dass komplexe Objekte ordnungsgemäß übergeben werden. gegen die manuelle Konvertierung in URL-Parameter, die die Daten beschädigen können.
quelle
Als ich dieses Problem hatte, stellte sich heraus, dass der Parameter, den ich veröffentlichte, ein Array von Objekten anstelle eines einfachen Objekts war.
quelle
Gerade von Winkel 1.2 auf 1.3 aktualisiert, habe ein Problem im Code gefunden. Das Transformieren einer Ressource führt zu einer Endlosschleife, weil (glaube ich) das $ -Versprechen wieder dasselbe Objekt enthält. Vielleicht hilft es jemandem ...
Ich könnte das beheben durch:
quelle
Ich habe den Code der akzeptierten Antwort (Felipes Code) für eine Weile verwendet und er hat großartig funktioniert (danke, Felipe!).
Kürzlich habe ich jedoch festgestellt, dass es Probleme mit leeren Objekten oder Arrays gibt. Zum Beispiel beim Senden dieses Objekts:
PHP scheint B und C überhaupt nicht zu sehen. Es bekommt das:
Ein Blick auf die aktuelle Anfrage in Chrome zeigt Folgendes:
Ich habe ein alternatives Code-Snippet geschrieben. Es scheint gut mit meinen Anwendungsfällen zu funktionieren, aber ich habe es nicht ausgiebig getestet. Verwenden Sie es daher mit Vorsicht.
Ich habe TypeScript verwendet, weil ich starkes Tippen mag, aber es wäre einfach, in reines JS zu konvertieren:
Es ist weniger effizient als Felipes Code, aber ich denke nicht, dass es wichtig ist, da es im Vergleich zum Gesamtaufwand der HTTP-Anfrage selbst sofort erfolgen sollte.
Jetzt zeigt PHP:
Soweit ich weiß, ist es nicht möglich, PHP dazu zu bringen, zu erkennen, dass Ba und C leere Arrays sind, aber zumindest die Schlüssel erscheinen, was wichtig ist, wenn es Code gibt, der auf einer bestimmten Struktur beruht, selbst wenn er im Wesentlichen leer ist.
Beachten Sie auch, dass undefinierte s und null s in leere Zeichenfolgen konvertiert werden .
quelle
Geben Sie einfach die Daten, die Sie senden möchten, als zweiten Parameter ein:
Eine andere Form, die auch funktioniert, ist:
Stellen Sie sicher, dass
paramName
der Name des Parameters der aufgerufenen Funktion genau übereinstimmt.Quelle: AngularJS-Post-Shortcut-Methode
quelle
Ich habe dies durch folgende Codes gelöst:
Client Side (Js):
Beachten Sie, dass Daten ein Objekt sind.
Auf dem Server (ASP.NET MVC):
und 'AllowCrossSiteJsonAttribute' wird für domänenübergreifende Anforderungen benötigt:
Hoffe das war nützlich.
quelle