Porównaj ceny domen i usług IT, sprzedawców z całego świata

Nie można umieścić prostych danych łańcuchowych w interfejsach internetowych z Angularjs


Próbuję uzyskać ciąg JSON z mojej aplikacji kątowej w interfejsie API sieci Web. Przez ostatnie 6 godzin szukałem w całym internecie, próbując bezskutecznie dowiedzieć się, co robię źle.
Sprawdziłem konsolę sieciową i widzę json jako dane formularza, ale moje WEB API NIE dostaje się z jakiegoś powodu. Przejrzałem kilka innych postów, ale żaden z nich nie pomógł mi rozwiązać mojego konkretnego problemu. Każdy kierunek byłby świetny. Próbowałem już użyć poprawki „transformacji”, ale to nie pomogło.
PUNKTY WEB WEB API
[HttpPost]
[Route("api/SkeltaInterfaceController/SaveWorkflow")]
public bool SaveWorkflow([FromBody] string json)
{
...
}

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


EDYCJA: I

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

Wygląda to tak
[HttpPost]
[Route("api/SkeltaInterfaceController/SaveWorkflow")]
public bool SaveWorkflow([FromBody] TestModel json)
{
...
}

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

Jednak nadal otrzymuję wartość NULL dla danych, coś, co skonfigurowałem?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Chociaż masz rozwiązanie, możesz przejść na kilka sposobów


prosty


Dane
Post
String
(nie obiekt)

w

Usługa
Web API
.
Przypuśćmy, że masz tak jakby API (w teście apicontroller)
public void Post([FromBody]string value)
{
//do something with value
}

Z
AngularJS
możesz opublikować tę metodę w ten sposób

(1)

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

Domyślnie zostanie użyty
Content-Type: application/json
. A serwer będzie przetwarzał dane jako JSON. Jeśli spojrzysz na żądanie, zobaczysz, że treść żądania jest prostym ciągiem, takim jak
"test"

W przypadku złożonych obiektów zobaczysz je w formacie JSON.

(2)

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

Tutaj wyraźnie określamy typ zawartości
application/x-www-form-urlencoded
, więc musimy wysłać dane w tym formacie (bardzo podobnym do ciągu zapytania url). I tu

pusty klucz

w danych

po prostu spełnia dziwne wymagania dotyczące powiązania modelu
Web API
!

Odebrane dane zostaną zakodowane w następujący sposób
=test

co zrobiliśmy z
$ .param ({"": "test"})
. Jednym z powodów jest to, że
FromBody
jest używany głównie do wysyłania
object
, a nie prostych wartości pierwotnych.
Więc główny

problem

Twoim kodem było to, co określiłeś

typ zawartości: application/x-www-form-urlencoded

i wysłał dane jako

JSON!
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Myślę, że twój problem sprowadza się do metody kontrolera WebApi, która oczekuje otrzymania ciągu, ale przekazujesz do niego obiekt. Czy to przynajmniej trafienie w metodę, ale uzyskanie zera?
Zależy to od tego, co próbujesz wysłać do metody kontrolera WebApi, ale jeśli chcesz wysłać obiekt, musisz utworzyć model reprezentujący ten obiekt w projekcie WebApi i wymusić na metodzie zaakceptowanie obiektu jako parametru.
Na przykład, tak jak teraz to robisz, zrobiłbyś coś takiego:
public class SaveModel 
{
public string DATA {get; set;}
}
[HttpPost]
[Route("api/SkeltaInterfaceController/SaveWorkflow")]
public bool SaveWorkflow([FromBody] SaveModel model)
{ ...

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się