无法 post 将简单的字符串数据从 AngularJS 发送到 Web API
Unable to post simple string data to Web API from AngularJS
我正在尝试从我的 angular 应用程序获取一个 json 字符串到 Web API。在过去的 6 个小时里,我在互联网上到处查看,试图找出我做错了什么,但悲惨地失败了。
我已经检查了网络控制台,我可以看到 json 作为表单数据,但是我的 WEB api 出于某种原因没有得到它。我看过其他几篇文章,但 none 似乎对我的特定问题有所帮助。任何方向都会很棒。我已经尝试使用 "transform" 修复程序,但这没有帮助。
网络入口点API
[HttpPost]
[Route("api/SkeltaInterfaceController/SaveWorkflow")]
public bool SaveWorkflow([FromBody] string json)
{
...
}
ANGULAR 通话
$scope.SaveWorkFlow = function () {
$http({
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
method: "POST",
url: webAPI,
data: {'DATA' : 'TEST DATA'
}
})
}
编辑:我将angular调用更改为此
$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 的空值,是我设置有误吗?
我认为您的问题归结为期望接收字符串的 WebApi 控制器方法,但您向它传递了一个对象。是否至少命中方法但收到空值?
这取决于您要发送给 WebApi 控制器方法的内容,但如果您打算发送一个对象,则应该在您的 WebApi 项目中创建一个表示该对象的模型,并让该方法将一个对象作为参数.
例如,您现在的方式是:
public class SaveModel
{
public string DATA {get; set;}
}
[HttpPost]
[Route("api/SkeltaInterfaceController/SaveWorkflow")]
public bool SaveWorkflow([FromBody] SaveModel model)
{ ...
虽然你已经找到了解决方案,但还是有一些方法可以POST
简单的string
数据(不是对象)到 Web API
服务。
假设您有一个像这样的 POST API(在 Test ApiController 中)
public void Post([FromBody]string value)
{
//do something with value
}
从 AngularJS
你可以 post 像
这样的方法
(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 查询字符串)。而且,这里data中的empty key是只是为了满足Web API
奇怪的模型绑定要求!结果数据将是编码如
=test
我们已经用 $.param({ "": "test" })
完成了。原因之一,FromBody
主要用于发送 object
,而不是简单的原始值。
因此,您的代码的基本问题是,您指定了内容类型:application/x-www-form-urlencoded并且您正在发送数据为 JSON!
我正在尝试从我的 angular 应用程序获取一个 json 字符串到 Web API。在过去的 6 个小时里,我在互联网上到处查看,试图找出我做错了什么,但悲惨地失败了。
我已经检查了网络控制台,我可以看到 json 作为表单数据,但是我的 WEB api 出于某种原因没有得到它。我看过其他几篇文章,但 none 似乎对我的特定问题有所帮助。任何方向都会很棒。我已经尝试使用 "transform" 修复程序,但这没有帮助。
网络入口点API
[HttpPost]
[Route("api/SkeltaInterfaceController/SaveWorkflow")]
public bool SaveWorkflow([FromBody] string json)
{
...
}
ANGULAR 通话
$scope.SaveWorkFlow = function () {
$http({
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
method: "POST",
url: webAPI,
data: {'DATA' : 'TEST DATA'
}
})
}
编辑:我将angular调用更改为此
$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 的空值,是我设置有误吗?
我认为您的问题归结为期望接收字符串的 WebApi 控制器方法,但您向它传递了一个对象。是否至少命中方法但收到空值?
这取决于您要发送给 WebApi 控制器方法的内容,但如果您打算发送一个对象,则应该在您的 WebApi 项目中创建一个表示该对象的模型,并让该方法将一个对象作为参数.
例如,您现在的方式是:
public class SaveModel
{
public string DATA {get; set;}
}
[HttpPost]
[Route("api/SkeltaInterfaceController/SaveWorkflow")]
public bool SaveWorkflow([FromBody] SaveModel model)
{ ...
虽然你已经找到了解决方案,但还是有一些方法可以POST
简单的string
数据(不是对象)到 Web API
服务。
假设您有一个像这样的 POST API(在 Test ApiController 中)
public void Post([FromBody]string value)
{
//do something with value
}
从 AngularJS
你可以 post 像
(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 查询字符串)。而且,这里data中的empty key是只是为了满足Web API
奇怪的模型绑定要求!结果数据将是编码如
=test
我们已经用 $.param({ "": "test" })
完成了。原因之一,FromBody
主要用于发送 object
,而不是简单的原始值。
因此,您的代码的基本问题是,您指定了内容类型:application/x-www-form-urlencoded并且您正在发送数据为 JSON!