无法从AngularJS将简单字符串数据发布到Web API
本文关键字:Web API 数据 字符串 AngularJS 简单 | 更新日期: 2023-09-27 18:22:04
我正在尝试从我的angular应用程序向Web API获取一个json字符串。在过去的6个小时里,我浏览了整个互联网,试图弄清楚自己做错了什么,但都失败了。
我已经检查了网络控制台,我可以看到json作为表单数据,但由于某种原因,我的WEB api没有得到它。我已经查看了其他几篇文章,但似乎没有一篇对我的特定问题有帮助。任何方向都很好。我已经尝试过使用"转换"修复程序,但没有帮助。
WEB API 的入口点
[HttpPost]
[Route("api/SkeltaInterfaceController/SaveWorkflow")]
public bool SaveWorkflow([FromBody] string json)
{
...
}
角度呼叫
$scope.SaveWorkFlow = function () {
$http({
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
method: "POST",
url: webAPI,
data: {'DATA' : 'TEST DATA'
}
})
}
编辑:我将角度调用更改为此
$scope.SaveWorkFlow = function () {
$http({
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
method: "POST",
url: webAPI,
data: {'DATA' : 'TEST DATA'}
})
}
Web API看起来像这个
[HttpPost]
[Route("api/SkeltaInterfaceController/SaveWorkflow")]
public bool SaveWorkflow([FromBody] TestModel json)
{
...
}
和模型
public class TestModel
{
public string DATA { get; set; }
}
不过,我仍然得到DATA的空值,这是我设置错误的吗?
虽然您有一个解决方案,但有一些方法可以将POST
简单的string
数据(而不是对象)发送到Web API
服务。
假设您有这样的POST API(在测试ApiController中)
public void Post([FromBody]string value)
{
//do something with value
}
从AngularJS
,你可以像一样发布到这种方法
(1)数据为JSON
(默认)
$scope.Test = function () {
$http({
method: "POST",
url: "/api/Test",
data: JSON.stringify("test")
});
};
默认情况下,这将使用Content-Type: application/json
。服务器会将数据视为JSON。如果你查看请求,你会发现请求主体是一个简单的字符串,比如
"test"
对于复杂的对象,您会看到它们是JSON格式的。
(2)数据为application/x-www-form-urlencoded
(如您的示例)
$scope.Test = function () {
$http({
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
method: "POST",
url: "/api/Test",
data: $.param({ "": "test" }),
});
};
在这里,我们明确地将内容类型指定为application/x-www-form-urlencoded
,因此我们必须以该格式发送数据(很像url查询字符串)。这里,数据中的空键只是为了满足Web API
奇怪的模型绑定要求生成的数据将像一样进行编码
=test
这是我们用CCD_ 10做的。其中一个原因是,FromBody
主要用于发送object
,而不是简单的基元值。
因此,代码的基本问题是,您指定了内容类型:application/x-www-form-urlencoded,而您将数据发送为JSON
我认为您的问题归结为WebApi控制器方法期望接收一个字符串,但您正在向它传递一个对象。它是否至少命中了方法,但收到了null?
这取决于你试图向WebApi控制器方法发送什么,但如果你想发送一个对象,你应该在你的WebApi项目中创建一个代表该对象的模型,并让该方法将一个对象作为参数。
例如,按照你现在的方式,你会做一些类似的事情:
public class SaveModel
{
public string DATA {get; set;}
}
[HttpPost]
[Route("api/SkeltaInterfaceController/SaveWorkflow")]
public bool SaveWorkflow([FromBody] SaveModel model)
{ ...