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

11

我正在尝试从我的Angular应用程序将JSON字符串发送到Web API。我已经在互联网上搜索了过去6个小时,但一直无法弄清楚我做错了什么。

我已经检查了网络控制台,可以看到json作为表单数据,但是由于某种原因,我的Web API没有收到它。我查看了其他几篇文章,但似乎没有帮助解决我的问题。任何指导都将非常有帮助。我已经尝试使用“transform”修复程序,但那也没有帮助。

WEB 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; }
}

我仍然收到一个空值(null)的DATA,这是我设置错了吗?


你能导入 Request.InputStream 吗?如果可以的话,请提供完整的 .NET 类。 - Sean Larkin
你使用什么后端框架?Angular的版本是多少? - Shaohao
2个回答

39
尽管您已经得到了一个解决方案,但是有一些方法可以向Web API服务POST简单的字符串数据(而不是对象)。假设您有一个像这样的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的奇怪模型绑定要求!生成的数据将被编码为

=test

我们使用了$.param({ "": "test" })来完成这个过程。其中一个原因是,FromBody主要用于发送对象,而不是简单的基本值。
因此,你代码中的基本问题是,你指定了Content Type : application/x-www-form-urlencoded,但你却发送了JSON格式的数据!

FYI:$.param从来没有为我工作过。我尝试过了。我不知道问题出在哪里。 - Willy
1
@Willy $ .param({“”:“YourStringValue”})很好用,只要(1)键为空,(2)Content-Type为application / x-www-form-urlencoded。如果不起作用,请检查发送到服务器的请求和/或开发控制台中的其他错误。 - Arghya C

7

我认为你的问题在于WebApi控制器方法期望接收一个字符串,但你传递给它一个对象。它至少能够进入这个方法,但是收到了null吗?

这取决于你想要发送什么给WebApi控制器方法,但如果你想要发送一个对象,你应该在WebApi项目中创建一个表示该对象的模型,并让该方法将对象作为参数。

例如,现在你可以像这样操作:

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


[HttpPost]
[Route("api/SkeltaInterfaceController/SaveWorkflow")]
public bool SaveWorkflow([FromBody] SaveModel model)
{ ...

回答你的问题,是的。它正在调用方法但接收到了空值。 - Willy
这听起来像我描述的问题。由于您在 $http 请求中传递了一个带有单个字符串参数“DATA”的对象,因此 WebApi 方法接收并反序列化该对象。但是,由于它期望只是一个字符串并收到了完全不同的对象,它认为请求无效并为该参数提供 null。如果您要传递给 WebApi 方法的所有内容都是一个字符串,那么您应该能够将其作为数据传递,而不是带有字符串参数的 JSON 对象。 - mattherman
请检查我的修改。我可能做错了什么,或者存在更深层次的问题。 - Willy
你能试着将内容类型更改为“application/json”吗? - mattherman
就像我之前说的那样,如果你只想发送一个字符串,你应该能够将参数类型设置回字符串,然后只发送一个字符串而不是一个对象,例如 { ...., data: '测试数据', ....},而不是 { ...., data: { 'DATA': '测试数据' }, .... }。 - mattherman
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接