我正在尝试从我的角度应用程序获取一个json字符串到Web API。在过去的6个小时里,我一直在寻找互联网,试图找出我做错了什么而惨遭失败。
我已经检查了网络控制台,我可以看到json作为表单数据,但我的WEB api由于某种原因没有得到它。我看了几个其他帖子,但似乎没有一个对我的特定问题有所帮助。任何方向都会很棒。我已经尝试过使用“转换”修复程序,但这没有帮助。
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'
}
})
}
编辑:我将角度调用更改为此
$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的空值,我设置错了吗?
答案 0 :(得分:30)
虽然您有解决方案,但有一些方法可以 POST
简单的 string
数据(不是对象) Web API
服务。
假设你有一个这样的POST API(在Test 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
奇怪的模型绑定要求!结果数据将被编码为< / p>
=test
我们已经使用$.param({ "": "test" })
完成了这项工作。其中一个原因是,FromBody
主要用于发送object
,而不是简单的原始值。
因此,代码的基本问题是,您指定了内容类型:application / x-www-form-urlencoded ,并且您将数据发送为< EM> JSON!的
答案 1 :(得分:6)
我认为你的问题归结为期望接收字符串的WebApi控制器方法,但你传递的是一个对象。它是否至少击中了方法但是收到了空?
这取决于您尝试发送到WebApi控制器方法的内容,但如果您要发送对象,则应创建一个表示WebApi项目中该对象的模型,并让该方法将对象作为参数。
例如,你现在拥有它的方式就是:
public class SaveModel
{
public string DATA {get; set;}
}
[HttpPost]
[Route("api/SkeltaInterfaceController/SaveWorkflow")]
public bool SaveWorkflow([FromBody] SaveModel model)
{ ...