Angular2 HTTP Post ASP.NET MVC-Web-API
Wie gehen Sie richtig erstellen eines Web API-POST eines komplexen Objekts oder mehrerer Parameter unter Verwendung Angular2?
Habe ich eine service-Komponente im Angular2, wie unten gesehen:
public signin(inputEmail: string, inputPassword: string): Observable<Response> {
return this.http.post('/api/account/signin', JSON.stringify({ Email: inputEmail, Password: inputPassword}), this.options);
}
Die gezielte web-api ist unten zu sehen:
[HttpPost]
[Route("signin")]
public async Task<IActionResult> Signin(string email, string password)
{
....
}
Funktioniert das nicht, weil ich brauche, um zu konvertieren, die Parameter des web-api in einem einzigen POCO entity-Klasse mit E-Mail und Passwort-Eigenschaften und legen Sie die [FromBody] Attribut: Signin([FromBody] Credential credential)
Ohne Verwendung [FromURI]
(POST-Abfragen mit query-strings?), wie kann ich Beiträge von mehreren Parametern oder komplexe Objekte ohne Konvertierung diese Parameter in einem einzigen POCO-Klasse?
Weil was ist, wenn ich habe zahlreiche Web-API-POST-Aktionen mit Parametern wie (string sensitiveInfo1, string name, int sensitiveInfo2)
oder (ClassifiedInfo info, string sensitiveInfo1, string sensitiveInfo2)
muss ich konvertieren Sie Sie alle zu POCO-Klassen, und immer mit [FromBody]?
PS.
Ich war mit RestangularJS
vor und es können Beiträge etwas (mehrere primitive Objekte und komplexe Objekte) ohne meine Web-API-Aktionen mit [FromBody]
Attribute. Wird etwa zu untersuchen, wie RestangularJS es tun.
- Da müssen Sie definieren Argumente, die auf die Aktion mit
email
undpassword
mite
undp
im unteren Fall, ich denke, dass der javascript-code sollte gleich sein, zum Beispiel:JSON.stringify({ email: inputEmail, password: inputPassword})
. - Dies gilt nicht für .NET mit JSON.Net wie dem JSON-serializer. Es ist standardmäßig nicht case sensitive.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich weiß, das ist nicht das, was du hören willst, aber out of the box ist das nicht möglich. Es ist keine Beschränkung des browser-code, der die Anforderung stellt. Dies bedeutet, es spielt keine Rolle, wenn Sie mit Angular, JQuery, gerade JavaScript, oder sogar RestangularJS. Dies ist eine Einschränkung (ich benutze das Wort Locker, wie ich bin sicher, dies ist by design) der Web-API (in jeder version). Hier ist die Dokumentation zu diesem design: Parameterbindung in ASP.NET Web-API von Mike Wasson.
So wird die Frage, was sind Ihre Optionen?
Ein Modell erstellen
Dies ist die Sache, die Sie versuchen zu vermeiden, aber ich Liste es zuerst, weil das ist, wie Web-API gedacht war, zu Verhalten. Ich habe noch nicht gehört, einen zwingenden Grund, dies nicht zu tun. Dieser Ansatz ermöglicht es Ihnen, erweitern Sie Ihr Modell einfach ohne Veränderung der Signatur der Methode. Es ermöglicht auch die Validierung des Modells auf das Modell selbst. Ich persönlich mag diesen Ansatz.
Ich nicht wiederholen, Ihre vorhandenen JavaScript-code, weil das, was Sie arbeiten, ist wie mit den oben genannten web-api-code
URL
Wieder, was Sie versuchen zu vermeiden. Das macht, was Sie möchten möglich, mit der Einschränkung, dass Sie haben, übergeben Sie diese Parameter über den Query-string der URL. Das JavaScript würde sich ändern, aber die Signatur, die Sie hatte, auf der Web-API-Methode nicht.
Ich nicht wiederholen, Ihre vorhandenen Web-API-code, weil das, was Sie arbeiten, ist wie mit den oben genannten web-JavaScript-code (standardmäßig FromUri wird davon ausgegangen, glaube ich)
Benutzerdefinierte Binder Modell
Sehen Die übergabe mehrerer POST-Parameter an die Web-API-Controller-Methoden von Rick Strahl. Diese option ermöglicht das erstellen einer custom-Modell, Sammelmappe, konnte tun, was Sie Fragen. Es ist eine ganze Reihe von extra-code, obwohl für die, IMHO, nicht viel nutzen. Vielleicht gibt es Situationen, wo es nützlich wäre, obwohl ich wirklich nicht glaube, jeder aus der Spitze von meinem Kopf.
Dynamische
Schließlich könnte man auch in ein
dynamic
- Objekt als parameter der Web-API. Dies ist im wesentlichen der gleiche wie empfangen der JSON als string und macht Ihre Controller-code verantwortlich für die Deserialisierung von Inhalten. Wieder, ich glaube, das würde machen den code schlechter, in den meisten Situationen, die Sie implementieren müssen, um die benutzerdefinierte Validierung und Typ-Prüfungen. Diese Antwort wurde vorgeschlagen zuvor auf SO von Bes Ley. Wieder, vielleicht gibt es Situationen, wo es nützlich wäre, obwohl ich wirklich nicht glaube, jeder aus der Spitze von meinem Kopf.Rufen Sie Web API 2.2 post-Methode aus Winkel-2 Art Skript, vergessen Sie nicht, fügen Sie die folgende header-Inhalt und parameter-Objekt.
Vielleicht sollte man post mit Optionen:
und Daten zu verschlüsseln, wie
WebAPI nicht diese aus der box. Wenn Sie versuchen, um Verständnis von web-API-bindings, die Sie vielleicht in der Lage sein, um herauszufinden, warum.
Ich denke dieser Artikel helfen könnte.
Habe ich das Problem der Angular2 HTTP Post ASP.NET MVC-Web-API
WebApi wird in der Lage sein zu Deserialisieren Ihre Anmeldeinformationen-Objekt enthalten, das das JSON-Objekt hat die gleichen Feldnamen (ich bin mir nicht sicher über den Fall, so können Sie hier). Sie scheinen zu fehlen die Header aus dem post-Aufruf in Ihr Angular2 Komponente.
Können Sie den Inhalt überprüfen-Typ unter Verwendung der Chrome-Debugger oder Fiddler? Es sollte application/json.
Versuchen Sie dieser, vorbei an einem komplexen Objekt der Klasse in einen einzigen data-parameter.
erhalten Sie es mit einem JObject in Ihrem API-controller und Deserialisieren von es als nach Ihren Klassen.