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

标签 c# angularjs web-services http-post asp.net-web-api

我正在尝试从我的 Angular 应用程序获取一个 json 字符串到 Web API。在过去的 6 个小时里,我在互联网上到处查看,试图弄清楚我做错了什么,但悲惨地失败了。

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

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

不过,我仍然得到 DATA 的空值,是我设置有误吗?

最佳答案

虽然您已经找到了解决方案,但还是有一些方法可以POST 简单的string 数据(不是对象)Web API 服务。

假设您有一个这样的 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奇怪的模型绑定(bind)要求!结果数据将被编码为

=test

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

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

关于c# - 无法从 AngularJS 将简单的字符串数据发布到 Web API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33742749/

相关文章:

c# - List<Int> XML 序列化

c# - 将文件数组从 Jquery ajax 发送到 Controller 操作

javascript - Angular - 仅当您单击 div 的特定区域时,div 上的 ng-click 才有效

playframework - Play Framework 2.1.0 和 AngularJS 集成

html - 如何以特定方式使 div 内联?

c# - 是否可以创建完全包含在 .svc 文件中的 ASP.NET Web 服务?

c# - 处置在 DirectorySearcher 中未按预期工作

c# - 为使用 Xamarin.Forms 构建的 Android 应用程序实现自动更新的正确方法

wcf - SOA,请求/响应服务层,接受和返回请求/响应与数组还是请求/响应?

ios - 保存登录 session 凭据并在整个应用程序中加载