2015-11-16 6 views
7

Ich versuche, eine JSON-Zeichenfolge von meiner eckigen App zu einer Web-API zu bekommen. Ich habe die letzten 6 Stunden im ganzen Internet geschaut und versucht, kläglich zu versagen, um herauszufinden, was ich falsch mache.Einfache String-Daten können nicht an Web API von AngularJS gesendet werden

Ich habe die Netzwerkkonsole überprüft und ich kann die JSON als Formulardaten sehen, aber meine WEB-API aus irgendeinem Grund bekommt es nicht. Ich habe mir verschiedene andere Beiträge angeschaut, aber keine scheint mir bei meinem speziellen Problem geholfen zu haben. Jede Richtung wäre großartig. Ich habe bereits versucht, den "transform" -Fix zu verwenden, aber das hat nicht geholfen.

Eintrag auf WEB API

[HttpPost] 
[Route("api/SkeltaInterfaceController/SaveWorkflow")] 
public bool SaveWorkflow([FromBody] string json) 
{ 
    ... 
} 

WINKEL CALL-

$scope.SaveWorkFlow = function() { 
    $http({ 
     headers: {'Content-Type': 'application/x-www-form-urlencoded'}, 
     method: "POST", 
     url: webAPI, 
     data: {'DATA' : 'TEST DATA' 
     } 
    }) 
} 

EDIT: Ich verändert die Winkel Aufruf dieser

$scope.SaveWorkFlow = function() { 
    $http({ 
     headers: {'Content-Type': 'application/x-www-form-urlencoded'}, 
     method: "POST", 
     url: webAPI, 
     data: {'DATA' : 'TEST DATA'} 
    }) 
} 

Die Web API wie folgt aussieht

[HttpPost] 
[Route("api/SkeltaInterfaceController/SaveWorkflow")] 
public bool SaveWorkflow([FromBody] TestModel json) 
{ 
    ... 
} 

Und das Modell

public class TestModel 
{ 
    public string DATA { get; set; } 
} 

Ich bin immer noch, obwohl einen Nullwert für DATA bekommen, was ich falsch eingestellt?

+0

Können Sie 'Request.InputStream' importieren? Auch wenn Sie bitte die vollständige .NET-Klasse bereitstellen könnten. –

+0

Welches Backend-Framework verwenden Sie? Was ist die Version von Angular? –

+0

Angular ist bei 1.4 – Willy

Antwort

6

Ich denke, Ihr Problem kommt auf die WebApi-Controller-Methode zu erwarten, eine Zeichenfolge zu erhalten, aber Sie übergeben es ein Objekt. Trifft es zumindest die Methode, erhält aber null?

Es hängt davon ab, was Sie an die WebApi-Controller-Methode senden möchten, aber wenn Sie ein Objekt senden möchten, sollten Sie ein Modell erstellen, das dieses Objekt in Ihrem WebApi-Projekt darstellt und ein Objekt als Parameter verwenden .

Zum Beispiel die Art und Weise haben Sie es jetzt tun würde Sie so etwas wie:

public class SaveModel 
{ 
    public string DATA {get; set;} 
} 


[HttpPost] 
[Route("api/SkeltaInterfaceController/SaveWorkflow")] 
public bool SaveWorkflow([FromBody] SaveModel model) 
{ ... 
+0

Um Ihre Frage zu beantworten, ja. Es trifft die Methode, erhält aber eine Null. – Willy

+0

Das klingt nach dem Problem, das ich beschrieben habe. Da Sie ein Objekt mit einem einzelnen Zeichenfolgenparameter "DATA" in der $ http-Anforderung übergeben, empfängt und deserialisiert die WebApi-Methode das Objekt. Da jedoch nur eine Zeichenfolge erwartet wurde und ein völlig anderes Objekt empfangen wurde, wird die Anfrage als ungültig betrachtet und gibt für diesen Parameter null an. Wenn Sie an die WebApi-Methode nur eine Zeichenfolge übergeben möchten, sollten Sie diese als Daten und nicht als JSON-Objekt mit einem Zeichenfolgenparameter übergeben können. – mattherman

+0

Überprüfen Sie meine Bearbeitung. Ich habe entweder etwas falsch gemacht, oder es gibt ein tieferes Problem. – Willy

21

Obwohl Sie eine Lösung erhalten haben, gibt es einige Möglichkeiten, um POST einfache string Daten (nicht ein Objekt) zu einem Web API Service.

Angenommen, Sie eine POST-API wie diese haben (in Test ApiController)

public void Post([FromBody]string value) 
{ 
    //do something with value 
} 

Von AngularJS Sie diese Methode wie

(1) Daten als JSON (Standard) veröffentlichen können

$scope.Test = function() { 
    $http({ 
     method: "POST", 
     url: "/api/Test", 
     data: JSON.stringify("test") 
    }); 
}; 

Dies wird standardmäßig Content-Type: application/json verwenden. Und der Server behandelt die Daten als JSON. Wenn Sie auf Wunsch schauen, sehen Sie, die Anfrage Körper eine einfache Zeichenfolge ist, wie

"test" 

Für komplexe Objekte, können Sie sie sehen würde JSON formatiert.

(2) Daten als application/x-www-form-urlencoded (wie in Ihrem Beispiel)

$scope.Test = function() { 
    $http({ 
     headers: {'Content-Type': 'application/x-www-form-urlencoded'}, 
     method: "POST", 
     url: "/api/Test", 
     data: $.param({ "": "test" }), 
    }); 
}; 

Hier werden wir explizit den Inhaltstyp Angabe application/x-www-form-urlencoded zu sein, so haben wir Daten in diesem Format senden (ähnlich wie URL-Abfragezeichenfolge). Und hier ist der leere Schlüssel in den Daten gerade, zum der merkwürdigen Verbindungsanforderung des Modells Web API zu genügen! Die resultierenden Daten werden wie

=test 

kodiert werden, die mit $.param({ "": "test" }) we'have getan. Ein Grund dafür, FromBody wird hauptsächlich verwendet, um object, nicht einfache Grundwerte zu senden.

Also, das grundlegende Problem mit Ihrem Code war, hatte man Inhaltstyp angegeben: application/x-www-form-urlencoded und Sie die Daten als JSON sendeten!

+0

FYI: Das $ .param hat nie für mich gearbeitet. Ich habe das versucht. Ich weiß nicht, was das Problem war. – Willy

+1

@Willy Die '$ .param ({" ":" YourStringValue "})' funktioniert gut, solange (1) der Schlüssel leer ist, (2) Content-Type ist 'application/x-www-form- urlencodiert. Wenn es nicht funktioniert, überprüfen Sie die Anfrage, die auf den Server und/oder die Dev-Konsole für andere Fehler geht. –

Verwandte Themen