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

本文关键字:Web API 数据 字符串 AngularJS 简单 | 更新日期: 2023-09-27 18:22:04

我正在尝试从我的angular应用程序向Web API获取一个json字符串。在过去的6个小时里,我浏览了整个互联网,试图弄清楚自己做错了什么,但都失败了。

我已经检查了网络控制台,我可以看到json作为表单数据,但由于某种原因,我的WEB api没有得到它。我已经查看了其他几篇文章,但似乎没有一篇对我的特定问题有帮助。任何方向都很好。我已经尝试过使用"转换"修复程序,但没有帮助。

WEB API 的入口点

[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'
        }
    })
}

编辑:我将角度调用更改为此

$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的空值,这是我设置错误的吗?

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

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

假设您有这样的POST API(在测试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

这是我们用CCD_ 10做的。其中一个原因是,FromBody主要用于发送object,而不是简单的基元值。

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

我认为您的问题归结为WebApi控制器方法期望接收一个字符串,但您正在向它传递一个对象。它是否至少命中了方法,但收到了null?

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

例如,按照你现在的方式,你会做一些类似的事情:

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

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