C# 无法从AngularJS将简单字符串数据发布到Web API
我正在尝试从我的angular应用程序获取一个json字符串到一个Web API。在过去的6个小时里,我浏览了整个互联网,试图找出我做错了什么,但不幸失败了 我已经检查了网络控制台,可以看到json作为表单数据,但是出于某种原因,我的WEB api没有得到它。我看过其他几篇文章,但没有一篇对我的问题有帮助。任何方向都很好。我已经尝试过使用“transform”修复程序,但没有效果 WEB API的入口点C# 无法从AngularJS将简单字符串数据发布到Web API,c#,angularjs,web-services,http-post,asp.net-web-api,C#,Angularjs,Web Services,Http Post,Asp.net Web Api,我正在尝试从我的angular应用程序获取一个json字符串到一个Web API。在过去的6个小时里,我浏览了整个互联网,试图找出我做错了什么,但不幸失败了 我已经检查了网络控制台,可以看到json作为表单数据,但是出于某种原因,我的WEB api没有得到它。我看过其他几篇文章,但没有一篇对我的问题有帮助。任何方向都很好。我已经尝试过使用“transform”修复程序,但没有效果 WEB API的入口点 [HttpPost] [Route("api/SkeltaInterfaceControll
[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'
}
})
}
EDIT:I更改了对此的角度调用
$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; }
}
但是,我仍然得到一个空值,这是我设置的错误吗?我认为您的问题归结为希望接收字符串的WebApi控制器方法,但您正在向它传递一个对象。它是否至少命中了该方法,但接收空值 这取决于您试图发送给WebApi控制器方法的内容,但如果您打算发送对象,则应在WebApi项目中创建表示该对象的模型,并使该方法将对象作为参数 例如,您现在使用的方式是:
public class SaveModel
{
public string DATA {get; set;}
}
[HttpPost]
[Route("api/SkeltaInterfaceController/SaveWorkflow")]
public bool SaveWorkflow([FromBody] SaveModel model)
{ ...
虽然您已经找到了一个解决方案,但仍有一些方法可以
将简单的
数据(非对象)发布到Web API
服务
假设您有这样一个POST API(在Test ApiController中)
从AngularJS
你可以像
(1)数据为JSON
(默认)
默认情况下,这将使用内容类型:application/json
。服务器将把数据作为JSON处理。如果查看请求,您将看到请求主体是一个简单的字符串,如
"test"
对于复杂对象,您会看到它们是JSON格式的
(2)数据为应用程序/x-www-form-urlencoded
(如您的示例所示)
这里,我们显式地将内容类型指定为application/x-www-form-urlencoded
,因此我们必须以该格式发送数据(很像url查询字符串)。在这里,数据中的空键只是为了满足webapi
奇怪的模型绑定需求!结果数据的编码如下所示
=test
我们已经用$.param({“”:“test”})
完成了。原因之一是,FromBody
主要用于发送对象
,而不是简单的原语值
因此,代码的基本问题是,您指定了内容类型:application/x-www-form-urlencoded,并将数据作为JSON发送 你能导入请求.输入流吗?如果可以,请提供完整的.NET类。您使用什么后端框架?Angular的版本是什么?回答你的问题,是的。它正在命中该方法,但接收到空值。这听起来像我描述的问题。由于在$http请求中传递一个带有单个字符串参数“DATA”的对象,因此WebApi方法接收并反序列化该对象。但是,由于它只需要一个字符串,并且收到了一些完全不同的对象,因此它认为请求无效,并为该参数提供null。如果您试图传递给WebApi方法的只是一个字符串,那么您应该能够将其作为数据而不是带有字符串参数的JSON对象传递。请检查我的编辑。我不是做错了什么,就是有更深层次的问题。你能试着把内容类型改成“application/json”吗?我正要对此发表评论。我将类型更改为application/json,它可以完美地工作。我不想创建一个模型,但如果这是我必须要做的,那没关系。为我指明了正确的方向。我发现的每个示例都不断告诉我使用“application/x-www-form-urlencoded”,因此这应该有助于您理解为什么它会出现在那里。仅供参考:$.param从未对我起作用。我试过了。我不知道问题出在哪里。@Willy the$.param({“”:“YourStringValue”})
工作正常,只要(1)键是空的,(2)内容类型是application/x-www-form-urlencoded
。如果不起作用,请检查发送到服务器和/或开发人员控制台的请求是否存在其他错误。
"test"
$scope.Test = function () {
$http({
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
method: "POST",
url: "/api/Test",
data: $.param({ "": "test" }),
});
};
=test