Ich habe einen alten Code, der eine AJAX-POST-Anfrage über die Post-Methode von jQuery stellt und ungefähr so aussieht:
$.post("/foo/bar", requestData,
function(responseData)
{
//do stuff with response
}
requestData
ist nur ein Javascript-Objekt mit einigen grundlegenden Zeichenfolgeneigenschaften.
Ich bin gerade dabei, unsere Daten auf Angular umzustellen, und ich möchte diesen Aufruf durch $ http.post ersetzen. Ich habe mir Folgendes ausgedacht:
$http.post("/foo/bar", requestData).success(
function(responseData) {
//do stuff with response
}
});
Als ich dies tat, erhielt ich eine 500-Fehler-Antwort vom Server. Bei Verwendung von Firebug stellte ich fest, dass dies den Anfragetext wie folgt gesendet hat:
{"param1":"value1","param2":"value2","param3":"value3"}
Die erfolgreiche jQuery $.post
sendet den Text folgendermaßen:
param1=value1¶m2=value2¶m3=value3
Der Endpunkt, den ich treffe, erwartet Anforderungsparameter und nicht JSON. Meine Frage ist also, ob es überhaupt zu sagen gibt, dass $http.post
das Javascript-Objekt als Anforderungsparameter anstelle von JSON gesendet werden soll. Ja, ich weiß, dass ich die Zeichenfolge selbst aus dem Objekt erstellen kann, aber ich möchte wissen, ob Angular sofort etwas dafür bereitstellt.
quelle
$httpProvider.defaults
, funktioniert sie dann nicht. Gibt es einen Hinweis darauf?Cannot read property "jquery" of undefined.
Wie behebe ich das? PS. Transformationen pro Anruf funktionieren.Wenn Sie Angular> = 1.4 verwenden , ist hier die sauberste Lösung, die ich gefunden habe und die sich nicht auf benutzerdefinierte oder externe Elemente stützt:
Und dann können Sie dies überall in Ihrer App tun:
Außerdem werden die Daten korrekt als 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.quelle
Aus der AngularJS-Dokumentation:
Geben Sie also einen String als Parameter an. Wenn Sie das nicht wollen, verwenden Sie Transformationen. Nochmals aus der Dokumentation:
Weitere Informationen finden Sie in der Dokumentation .
quelle
Verwenden Sie die
$.param
Funktion von jQuery, um die JSON-Daten in requestData zu serialisieren.Kurz gesagt, verwenden Sie einen ähnlichen Code wie Ihren:
Um dies zu verwenden, müssen Sie jQuery zusammen mit AngularJS in Ihre Seite aufnehmen.
quelle
Beachten Sie, dass Sie ab Angular 1.4 die Formulardaten ohne Verwendung von jQuery serialisieren können.
In der app.js:
Dann in Ihrem Controller:
quelle
Dies mag ein bisschen hacken, aber ich habe das Problem vermieden und den JSON auf der Serverseite in das POST-Array von PHP konvertiert:
quelle
Ich habe auch Probleme beim Festlegen der benutzerdefinierten http-Authentifizierung, da $ resource die Anforderung zwischenspeichert.
Damit es funktioniert, müssen Sie die vorhandenen Header auf diese Weise überschreiben
Ich hoffe ich konnte jemandem helfen. Ich habe 3 Tage gebraucht, um das herauszufinden.
quelle
Ändern Sie die Standardheader:
Verwenden Sie dann die
$.param
Methode von JQuery :quelle
quelle
Schnelle Anpassung - Für diejenigen unter Ihnen, die Probleme mit der globalen Konfiguration der transformRequest-Funktion haben, ist hier das Snippet, das ich verwende, um den
Cannot read property 'jquery' of undefined
Fehler zu beseitigen:quelle
Sie können dieses Problem auch lösen, ohne den Code im Server zu ändern, den Header im
$http.post
Aufruf zu ändern und$_POST
den normalen Weg zu verwenden. Hier erklärt: http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/quelle
Ich fand oft problematisches Verhalten dieses Ganzen. Ich habe es von Express (ohne Typisierung) und BodyParser (mit den Typisierungen dt ~ body-parser) verwendet.
Ich habe nicht versucht, eine Datei hochzuladen, sondern einfach einen JSON zu interpretieren, der in einer Post-Zeichenfolge angegeben ist.
Das
request.body
war einfach ein leerer json ({}
).Nach vielen Nachforschungen hat das bei mir endlich geklappt:
Es kann auch wichtig sein, den
application/json
Inhaltstyp in der Anforderungszeichenfolge von der Clientseite anzugeben.quelle
Syntax für AngularJS v1.4.8 + (v1.5.0)
Z.B:
quelle