/ / Nedá sa odoslať jednoduché dátové reťazce do Web API z AngularJS - c #, angularjs, webových služieb, http-post, asp.net-web-api

Nepodarilo sa uverejňovať jednoduché reťazcové údaje do rozhrania Web API z AngularJS - c #, angularjs, web-services, http-post, asp.net-web-api

Snažím sa dostať reťazec json z mojej uhlovej aplikácie do Web API. Pozrel som sa po celom internete za posledných 6 hodín a snažil som sa neúspešne zistiť, čo robím zle.

Skontroloval som sieťovú konzolu a vidímjson ako dáta formulára, ale môj webový api z nejakého dôvodu sa nedostáva. Pozrel som sa na niekoľko ďalších príspevkov, ale zdá sa, že nikto nepomohol s mojím konkrétnym problémom. Akýkoľvek smer by bol veľký. Už som sa snažil použiť "transform" opravu, ale to nepomohlo.

VSTUPNÉ BODY NA 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"
}
})
}

EDIT: I zmenil uhlové volanie na toto

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

Web API vyzerá takto

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

A model

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

Stále dostávam nulovú hodnotu pre DATA, hoci niečo, čo som nastavil zle?

odpovede:

6 pre odpoveď č. 1

Domnievam sa, že váš problém spadá do metódy WebApi Controller, ktorá očakáva, že dostane reťazec, ale odovzdávate ho. Je to aspoň biť metódu, ale príjem null?

Záleží na tom, čo sa snažíte odoslaťMetóda WebApi radič, ale ak máte v úmysle odoslať objekt, mali by ste vytvoriť model, ktorý predstavuje tento objekt vo vašom projekte WebApi a mať metódu, aby objekt ako parameter.

Napríklad spôsob, akým ho máte teraz, urobíte niečo ako:

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


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

23 pre odpoveď č. 2

Hoci máte riešenie, existuje niekoľko spôsobov, ako POST prostý string údaje (nie objekt) na a Web API service.

Povedzme, že máte POST API, ako je toto (v Test ApiController)

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

z AngularJS môžete písať na túto metódu ako

(1) údaje ako JSON (Default)

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

To bude používať Content-Type: application/json predvolene. A server bude s údajmi zaobchádzať ako s JSON. Ak sa pozriete na požiadavku, uvidíte, že telo žiadosti je jednoduchý reťazec

"test"

Pri zložitých objektoch ich uvidíte vo formáte JSON.

(2) údaje ako application/x-www-form-urlencoded (ako v príklade)

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

Tu explicitne špecifikujeme typ obsahu, ktorý má byť application/x-www-form-urlencoded, takže musíme posielať údaje v tomto formáte (podobne ako reťazec dotazov url). A tu prázdny kľúč v údajoch len uspokojiť Web API's podivný model záväznú požiadavku! Výsledné dáta budú kódované podobne

=test

ktoré sme „urobili“ $.param({ "": "test" }), Jedným z dôvodov je FromBody sa používa hlavne na odosielanie object, nie jednoduché primitívne hodnoty.

Takže, základné problém s vaším kódom ste zadali Typ obsahu: application / x-www-form-urlencoded a odosielali ste údaje ako JSON!