无法将简单的字符串数据从AngularJS发布到Web API

Wil*_*lly 10 c# web-services http-post asp.net-web-api angularjs

我试图从我的角应用程序获取一个json字符串到Web API.在过去的6个小时里,我一直在寻找互联网,并且惨遭失败,弄清楚我做错了什么.

我检查了网络控制台,我可以看到json作为表单数据,但我的WEB api由于某种原因没有得到它.我看了几个其他帖子,但似乎没有任何帮助我的特定问题.任何方向都会很棒.我已经尝试使用"转换"修复,但这没有帮助.

进入WEB API的入口点

[HttpPost]
[Route("api/SkeltaInterfaceController/SaveWorkflow")]
public bool SaveWorkflow([FromBody] string json)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

角度呼叫

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

编辑:我改变了角度调用

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

Web API看起来像这样

[HttpPost]
[Route("api/SkeltaInterfaceController/SaveWorkflow")]
public bool SaveWorkflow([FromBody] TestModel json)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

和模型

public class TestModel
{
    public string DATA { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我仍然得到DATA的空值,我设置错了吗?

Arg*_*a C 30

虽然您有一个解决方案,但有一些方法可以将POST简单的string数据(而不是对象)提供给Web API服务.

假设你有一个像这样的POST API(在Test ApiController中)

public void Post([FromBody]string value)
{
    //do something with value
}
Run Code Online (Sandbox Code Playgroud)

AngularJS你可以发布到这种方法就像

(1)数据为JSON(默认)

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

这将Content-Type: application/json默认使用.服务器会将数据视为JSON.如果查看请求,您会看到请求正文是一个简单的字符串,如

"test"
Run Code Online (Sandbox Code Playgroud)

对于复杂对象,您会看到它们是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" }),
    });
};
Run Code Online (Sandbox Code Playgroud)

在这里,我们明确指定了内容类型application/x-www-form-urlencoded,因此我们必须以该格式发送数据(非常类似于url查询字符串).而且,在这里,数据中的空键只是为了满足Web API奇怪的模型绑定要求!结果数据将被编码为

=test
Run Code Online (Sandbox Code Playgroud)

我们已经完成了$.param({ "": "test" }).其中一个原因FromBody主要用于发送object,而不是简单的原始值.

因此,您的代码的基本问题是,您已指定内容类型:application/x-www-form-urlencoded并且您将数据作为JSON发送!


mat*_*man 7

我认为你的问题归结为期望接收字符串的WebApi控制器方法,但你传递的是一个对象.它是否至少击中了方法但是接收空?

这取决于您尝试发送到WebApi控制器方法的内容,但如果您要发送一个对象,则应创建一个在WebApi项目中表示该对象的模型,并让该方法将对象作为参数.

例如,你现在就拥有它的方式,你可以这样做:

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


[HttpPost]
[Route("api/SkeltaInterfaceController/SaveWorkflow")]
public bool SaveWorkflow([FromBody] SaveModel model)
{ ...
Run Code Online (Sandbox Code Playgroud)